vendor: 6,196 bytes, lines 1-152
1/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */ 2(function(global, factory) { 3 if (typeof define === 'function' && define.amd) 4 define(function() { return factory(global) }) 5 else 6 factory(global) 7}(this, function(window) { 8 var Zepto = (function() { 9 var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice, 10 document = window.document, 11 elementDisplay = {}, classCache = {}, 12 cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, 13 fragmentRE = /^\s*<(\w+|!)[^>]*>/, 14 singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, 15 tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, 16 rootNodeRE = /^(?:body|html)$/i, 17 capitalRE = /([A-Z])/g, 18 19 // special attributes that should be get/set via method calls 20 methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'], 21 22 adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ], 23 table = document.createElement('table'), 24 tableRow = document.createElement('tr'), 25 containers = { 26 'tr': document.createElement('tbody'), 27 'tbody': table, 'thead': table, 'tfoot': table, 28 'td': tableRow, 'th': tableRow, 29 '*': document.createElement('div') 30 }, 31 readyRE = /complete|loaded|interactive/, 32 simpleSelectorRE = /^[\w-]*$/, 33 class2type = {}, 34 toString = class2type.toString, 35 zepto = {}, 36 camelize, uniq, 37 tempParent = document.createElement('div'), 38 propMap = { 39 'tabindex': 'tabIndex', 40 'readonly': 'readOnly', 41 'for': 'htmlFor', 42 'class': 'className', 43 'maxlength': 'maxLength', 44 'cellspacing': 'cellSpacing', 45 'cellpadding': 'cellPadding', 46 'rowspan': 'rowSpan', 47 'colspan': 'colSpan', 48 'usemap': 'useMap', 49 'frameborder': 'frameBorder', 50 'contenteditable': 'contentEditable' 51 }, 52 isArray = Array.isArray || 53 function(object){ return object instanceof Array } 54 55 zepto.matches = function(element, selector) { 56 if (!selector || !element || element.nodeType !== 1) return false 57 var matchesSelector = element.matches || element.webkitMatchesSelector || 58 element.mozMatchesSelector || element.oMatchesSelector || 59 element.matchesSelector 60 if (matchesSelector) return matchesSelector.call(element, selector) 61 // fall back to performing a selector: 62 var match, parent = element.parentNode, temp = !parent 63 if (temp) (parent = tempParent).appendChild(element) 64 match = ~zepto.qsa(parent, selector).indexOf(element) 65 temp && tempParent.removeChild(element) 66 return match 67 } 68 69 function type(obj) { 70 return obj == null ? String(obj) : 71 class2type[toString.call(obj)] || "object" 72 } 73 74 function isFunction(value) { return type(value) == "function" } 75 function isWindow(obj) { return obj != null && obj == obj.window } 76 function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE } 77 function isObject(obj) { return type(obj) == "object" } 78 function isPlainObject(obj) { 79 return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype 80 } 81 82 function likeArray(obj) { 83 var length = !!obj && 'length' in obj && obj.length, 84 type = $.type(obj) 85 86 return 'function' != type && !isWindow(obj) && ( 87 'array' == type || length === 0 || 88 (typeof length == 'number' && length > 0 && (length - 1) in obj) 89 ) 90 } 91 92 function compact(array) { return filter.call(array, function(item){ return item != null }) } 93 function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array } 94 camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } 95 function dasherize(str) { 96 return str.replace(/::/g, '/') 97 .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') 98 .replace(/([a-z\d])([A-Z])/g, '$1_$2') 99 .replace(/_/g, '-') 100 .toLowerCase() 101 } 102 uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) } 103 104 function classRE(name) { 105 return name in classCache ? 106 classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')) 107 } 108 109 function maybeAddPx(name, value) { 110 return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value 111 } 112 113 function defaultDisplay(nodeName) { 114 var element, display 115 if (!elementDisplay[nodeName]) { 116 element = document.createElement(nodeName) 117 document.body.appendChild(element) 118 display = getComputedStyle(element, '').getPropertyValue("display") 119 element.parentNode.removeChild(element) 120 display == "none" && (display = "block") 121 elementDisplay[nodeName] = display 122 } 123 return elementDisplay[nodeName] 124 } 125 126 function children(element) { 127 return 'children' in element ? 128 slice.call(element.children) : 129 $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node }) 130 } 131 132 function Z(dom, selector) { 133 var i, len = dom ? dom.length : 0 134 for (i = 0; i < len; i++) this[i] = dom[i] 135 this.length = len 136 this.selector = selector || '' 137 } 138 139 // `$.zepto.fragment` takes a html string and an optional tag name 140 // to generate DOM nodes from the given html string. 141 // The generated DOM nodes are returned as an array. 142 // This function can be overridden in plugins for example to make 143 // it compatible with browsers that don't support the DOM fully. 144 zepto.fragment = function(html, name, properties) { 145 var dom, nodes, container 146 147 // A special case optimization for a single tag 148 if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1)) 149 150 if (!dom) { 151 if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>") 152 if (name === undefined) name = fragmentRE.test(html) && RegExp.$1
153 if (!(name in containers)) name = '*' 154 155 container = containers[name] 156 container.innerHTML = '' + html 157 dom = $.each(slice.call(container.childNodes), function(){ 158 container.removeChild(this) 159 }) 160 } 161 162 if (isPlainObject(properties)) { 163 nodes = $(dom) 164 $.each(properties, function(key, value) { 165 if (methodAttributes.indexOf(key) > -1) nodes[key](value) 166 else nodes.attr(key, value) 167 }) 168 } 169 170 return dom 171 } 172 173 // `$.zepto.Z` swaps out the prototype of the given `dom` array 174 // of nodes with `$.fn` and thus supplying all the Zepto functions 175 // to the array. This method can be overridden in plugins. 176 zepto.Z = function(dom, selector) { 177 return new Z(dom, selector) 178 } 179 180 // `$.zepto.isZ` should return `true` if the given object is a Zepto 181 // collection. This method can be overridden in plugins. 182 zepto.isZ = function(object) { 183 return object instanceof zepto.Z 184 } 185 186 // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
vendor: 49,528 bytes, lines 187-1535
187 // takes a CSS selector and an optional context (and handles various 188 // special cases). 189 // This method can be overridden in plugins. 190 zepto.init = function(selector, context) { 191 var dom 192 // If nothing given, return an empty Zepto collection 193 if (!selector) return zepto.Z() 194 // Optimize for string selectors 195 else if (typeof selector == 'string') { 196 selector = selector.trim() 197 // If it's a html fragment, create nodes from it 198 // Note: In both Chrome 21 and Firefox 15, DOM error 12 199 // is thrown if the fragment doesn't begin with < 200 if (selector[0] == '<' && fragmentRE.test(selector)) 201 dom = zepto.fragment(selector, RegExp.$1, context), selector = null 202 // If there's a context, create a collection on that context first, and select 203 // nodes from there 204 else if (context !== undefined) return $(context).find(selector) 205 // If it's a CSS selector, use it to select nodes. 206 else dom = zepto.qsa(document, selector) 207 } 208 // If a function is given, call it when the DOM is ready 209 else if (isFunction(selector)) return $(document).ready(selector) 210 // If a Zepto collection is given, just return it 211 else if (zepto.isZ(selector)) return selector 212 else { 213 // normalize array if an array of nodes is given 214 if (isArray(selector)) dom = compact(selector) 215 // Wrap DOM nodes. 216 else if (isObject(selector)) 217 dom = [selector], selector = null 218 // If it's a html fragment, create nodes from it 219 else if (fragmentRE.test(selector)) 220 dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null 221 // If there's a context, create a collection on that context first, and select 222 // nodes from there 223 else if (context !== undefined) return $(context).find(selector) 224 // And last but no least, if it's a CSS selector, use it to select nodes. 225 else dom = zepto.qsa(document, selector) 226 } 227 // create a new Zepto collection from the nodes found 228 return zepto.Z(dom, selector) 229 } 230 231 // `$` will be the base `Zepto` object. When calling this 232 // function just call `$.zepto.init, which makes the implementation 233 // details of selecting nodes and creating Zepto collections 234 // patchable in plugins. 235 $ = function(selector, context){ 236 return zepto.init(selector, context) 237 } 238 239 function extend(target, source, deep) { 240 for (key in source) 241 if (deep && (isPlainObject(source[key]) || isArray(source[key]))) { 242 if (isPlainObject(source[key]) && !isPlainObject(target[key])) 243 target[key] = {} 244 if (isArray(source[key]) && !isArray(target[key])) 245 target[key] = [] 246 extend(target[key], source[key], deep) 247 } 248 else if (source[key] !== undefined) target[key] = source[key] 249 } 250 251 // Copy all but undefined properties from one or more 252 // objects to the `target` object. 253 $.extend = function(target){ 254 var deep, args = slice.call(arguments, 1) 255 if (typeof target == 'boolean') { 256 deep = target 257 target = args.shift() 258 } 259 args.forEach(function(arg){ extend(target, arg, deep) }) 260 return target 261 } 262 263 // `$.zepto.qsa` is Zepto's CSS selector implementation which 264 // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`. 265 // This method can be overridden in plugins. 266 zepto.qsa = function(element, selector){ 267 var found, 268 maybeID = selector[0] == '#', 269 maybeClass = !maybeID && selector[0] == '.', 270 nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked 271 isSimple = simpleSelectorRE.test(nameOnly) 272 return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById 273 ( (found = element.getElementById(nameOnly)) ? [found] : [] ) : 274 (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] : 275 slice.call( 276 isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName 277 maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class 278 element.getElementsByTagName(selector) : // Or a tag 279 element.querySelectorAll(selector) // Or it's not simple, and we need to query all 280 ) 281 } 282 283 function filtered(nodes, selector) { 284 return selector == null ? $(nodes) : $(nodes).filter(selector) 285 } 286 287 $.contains = document.documentElement.contains ? 288 function(parent, node) { 289 return parent !== node && parent.contains(node) 290 } : 291 function(parent, node) { 292 while (node && (node = node.parentNode)) 293 if (node === parent) return true 294 return false 295 } 296 297 function funcArg(context, arg, idx, payload) { 298 return isFunction(arg) ? arg.call(context, idx, payload) : arg 299 } 300 301 function setAttribute(node, name, value) { 302 value == null ? node.removeAttribute(name) : node.setAttribute(name, value) 303 } 304 305 // access className property while respecting SVGAnimatedString 306 function className(node, value){ 307 var klass = node.className || '', 308 svg = klass && klass.baseVal !== undefined 309 310 if (value === undefined) return svg ? klass.baseVal : klass 311 svg ? (klass.baseVal = value) : (node.className = value) 312 } 313 314 // "true" => true 315 // "false" => false 316 // "null" => null 317 // "42" => 42 318 // "42.5" => 42.5 319 // "08" => "08" 320 // JSON => parse if valid 321 // String => self 322 function deserializeValue(value) { 323 try { 324 return value ? 325 value == "true" || 326 ( value == "false" ? false : 327 value == "null" ? null : 328 +value + "" == value ? +value : 329 /^[\[\{]/.test(value) ? $.parseJSON(value) : 330 value ) 331 : value 332 } catch(e) { 333 return value 334 } 335 } 336 337 $.type = type 338 $.isFunction = isFunction 339 $.isWindow = isWindow 340 $.isArray = isArray 341 $.isPlainObject = isPlainObject 342 343 $.isEmptyObject = function(obj) { 344 var name 345 for (name in obj) return false 346 return true 347 } 348 349 $.isNumeric = function(val) { 350 var num = Number(val), type = typeof val 351 return val != null && type != 'boolean' && 352 (type != 'string' || val.length) && 353 !isNaN(num) && isFinite(num) || false 354 } 355 356 $.inArray = function(elem, array, i){ 357 return emptyArray.indexOf.call(array, elem, i) 358 } 359 360 $.camelCase = camelize 361 $.trim = function(str) { 362 return str == null ? "" : String.prototype.trim.call(str) 363 } 364 365 // plugin compatibility 366 $.uuid = 0 367 $.support = { } 368 $.expr = { } 369 $.noop = function() {} 370 371 $.map = function(elements, callback){ 372 var value, values = [], i, key 373 if (likeArray(elements)) 374 for (i = 0; i < elements.length; i++) { 375 value = callback(elements[i], i) 376 if (value != null) values.push(value) 377 } 378 else 379 for (key in elements) { 380 value = callback(elements[key], key) 381 if (value != null) values.push(value) 382 } 383 return flatten(values) 384 } 385 386 $.each = function(elements, callback){ 387 var i, key 388 if (likeArray(elements)) { 389 for (i = 0; i < elements.length; i++) 390 if (callback.call(elements[i], i, elements[i]) === false) return elements 391 } else { 392 for (key in elements) 393 if (callback.call(elements[key], key, elements[key]) === false) return elements 394 } 395 396 return elements 397 } 398 399 $.grep = function(elements, callback){ 400 return filter.call(elements, callback) 401 } 402 403 if (window.JSON) $.parseJSON = JSON.parse 404 405 // Populate the class2type map 406 $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { 407 class2type[ "[object " + name + "]" ] = name.toLowerCase() 408 }) 409 410 // Define methods that will be available on all 411 // Zepto collections 412 $.fn = { 413 constructor: zepto.Z, 414 length: 0, 415 416 // Because a collection acts like an array 417 // copy over these useful array functions. 418 forEach: emptyArray.forEach, 419 reduce: emptyArray.reduce, 420 push: emptyArray.push, 421 sort: emptyArray.sort, 422 splice: emptyArray.splice, 423 indexOf: emptyArray.indexOf, 424 concat: function(){ 425 var i, value, args = [] 426 for (i = 0; i < arguments.length; i++) { 427 value = arguments[i] 428 args[i] = zepto.isZ(value) ? value.toArray() : value 429 } 430 return concat.apply(zepto.isZ(this) ? this.toArray() : this, args) 431 }, 432 433 // `map` and `slice` in the jQuery API work differently 434 // from their array counterparts 435 map: function(fn){ 436 return $($.map(this, function(el, i){ return fn.call(el, i, el) })) 437 }, 438 slice: function(){ 439 return $(slice.apply(this, arguments)) 440 }, 441 442 ready: function(callback){ 443 // need to check if document.body exists for IE as that browser reports 444 // document ready when it hasn't yet created the body element 445 if (readyRE.test(document.readyState) && document.body) callback($) 446 else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false) 447 return this 448 }, 449 get: function(idx){ 450 return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length] 451 }, 452 toArray: function(){ return this.get() }, 453 size: function(){ 454 return this.length 455 }, 456 remove: function(){ 457 return this.each(function(){ 458 if (this.parentNode != null) 459 this.parentNode.removeChild(this) 460 }) 461 }, 462 each: function(callback){ 463 emptyArray.every.call(this, function(el, idx){ 464 return callback.call(el, idx, el) !== false 465 }) 466 return this 467 }, 468 filter: function(selector){ 469 if (isFunction(selector)) return this.not(this.not(selector)) 470 return $(filter.call(this, function(element){ 471 return zepto.matches(element, selector) 472 })) 473 }, 474 add: function(selector,context){ 475 return $(uniq(this.concat($(selector,context)))) 476 }, 477 is: function(selector){ 478 return this.length > 0 && zepto.matches(this[0], selector) 479 }, 480 not: function(selector){ 481 var nodes=[] 482 if (isFunction(selector) && selector.call !== undefined) 483 this.each(function(idx){ 484 if (!selector.call(this,idx)) nodes.push(this) 485 }) 486 else { 487 var excludes = typeof selector == 'string' ? this.filter(selector) : 488 (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector) 489 this.forEach(function(el){ 490 if (excludes.indexOf(el) < 0) nodes.push(el) 491 }) 492 } 493 return $(nodes) 494 }, 495 has: function(selector){ 496 return this.filter(function(){ 497 return isObject(selector) ? 498 $.contains(this, selector) : 499 $(this).find(selector).size() 500 }) 501 }, 502 eq: function(idx){ 503 return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1) 504 }, 505 first: function(){ 506 var el = this[0] 507 return el && !isObject(el) ? el : $(el) 508 }, 509 last: function(){ 510 var el = this[this.length - 1] 511 return el && !isObject(el) ? el : $(el) 512 }, 513 find: function(selector){ 514 var result, $this = this 515 if (!selector) result = $() 516 else if (typeof selector == 'object') 517 result = $(selector).filter(function(){ 518 var node = this 519 return emptyArray.some.call($this, function(parent){ 520 return $.contains(parent, node) 521 }) 522 }) 523 else if (this.length == 1) result = $(zepto.qsa(this[0], selector)) 524 else result = this.map(function(){ return zepto.qsa(this, selector) }) 525 return result 526 }, 527 closest: function(selector, context){ 528 var nodes = [], collection = typeof selector == 'object' && $(selector) 529 this.each(function(_, node){ 530 while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector))) 531 node = node !== context && !isDocument(node) && node.parentNode 532 if (node && nodes.indexOf(node) < 0) nodes.push(node) 533 }) 534 return $(nodes) 535 }, 536 parents: function(selector){ 537 var ancestors = [], nodes = this 538 while (nodes.length > 0) 539 nodes = $.map(nodes, function(node){ 540 if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) { 541 ancestors.push(node) 542 return node 543 } 544 }) 545 return filtered(ancestors, selector) 546 }, 547 parent: function(selector){ 548 return filtered(uniq(this.pluck('parentNode')), selector) 549 }, 550 children: function(selector){ 551 return filtered(this.map(function(){ return children(this) }), selector) 552 }, 553 contents: function() { 554 return this.map(function() { return this.contentDocument || slice.call(this.childNodes) }) 555 }, 556 siblings: function(selector){ 557 return filtered(this.map(function(i, el){ 558 return filter.call(children(el.parentNode), function(child){ return child!==el }) 559 }), selector) 560 }, 561 empty: function(){ 562 return this.each(function(){ this.innerHTML = '' }) 563 }, 564 // `pluck` is borrowed from Prototype.js 565 pluck: function(property){ 566 return $.map(this, function(el){ return el[property] }) 567 }, 568 show: function(){ 569 return this.each(function(){ 570 this.style.display == "none" && (this.style.display = '') 571 if (getComputedStyle(this, '').getPropertyValue("display") == "none") 572 this.style.display = defaultDisplay(this.nodeName) 573 }) 574 }, 575 replaceWith: function(newContent){ 576 return this.before(newContent).remove() 577 }, 578 wrap: function(structure){ 579 var func = isFunction(structure) 580 if (this[0] && !func) 581 var dom = $(structure).get(0), 582 clone = dom.parentNode || this.length > 1 583 584 return this.each(function(index){ 585 $(this).wrapAll( 586 func ? structure.call(this, index) : 587 clone ? dom.cloneNode(true) : dom 588 ) 589 }) 590 }, 591 wrapAll: function(structure){ 592 if (this[0]) { 593 $(this[0]).before(structure = $(structure)) 594 var children 595 // drill down to the inmost element 596 while ((children = structure.children()).length) structure = children.first() 597 $(structure).append(this) 598 } 599 return this 600 }, 601 wrapInner: function(structure){ 602 var func = isFunction(structure) 603 return this.each(function(index){ 604 var self = $(this), contents = self.contents(), 605 dom = func ? structure.call(this, index) : structure 606 contents.length ? contents.wrapAll(dom) : self.append(dom) 607 }) 608 }, 609 unwrap: function(){ 610 this.parent().each(function(){ 611 $(this).replaceWith($(this).children()) 612 }) 613 return this 614 }, 615 clone: function(){ 616 return this.map(function(){ return this.cloneNode(true) }) 617 }, 618 hide: function(){ 619 return this.css("display", "none") 620 }, 621 toggle: function(setting){ 622 return this.each(function(){ 623 var el = $(this) 624 ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide() 625 }) 626 }, 627 prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') }, 628 next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') }, 629 html: function(html){ 630 return 0 in arguments ? 631 this.each(function(idx){ 632 var originHtml = this.innerHTML 633 $(this).empty().append( funcArg(this, html, idx, originHtml) ) 634 }) : 635 (0 in this ? this[0].innerHTML : null) 636 }, 637 text: function(text){ 638 return 0 in arguments ? 639 this.each(function(idx){ 640 var newText = funcArg(this, text, idx, this.textContent) 641 this.textContent = newText == null ? '' : ''+newText 642 }) : 643 (0 in this ? this.pluck('textContent').join("") : null) 644 }, 645 attr: function(name, value){ 646 var result 647 return (typeof name == 'string' && !(1 in arguments)) ? 648 (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) : 649 this.each(function(idx){ 650 if (this.nodeType !== 1) return 651 if (isObject(name)) for (key in name) setAttribute(this, key, name[key]) 652 else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name))) 653 }) 654 }, 655 removeAttr: function(name){ 656 return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){ 657 setAttribute(this, attribute) 658 }, this)}) 659 }, 660 prop: function(name, value){ 661 name = propMap[name] || name 662 return (1 in arguments) ? 663 this.each(function(idx){ 664 this[name] = funcArg(this, value, idx, this[name]) 665 }) : 666 (this[0] && this[0][name]) 667 }, 668 removeProp: function(name){ 669 name = propMap[name] || name 670 return this.each(function(){ delete this[name] }) 671 }, 672 data: function(name, value){ 673 var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase() 674 675 var data = (1 in arguments) ? 676 this.attr(attrName, value) : 677 this.attr(attrName) 678 679 return data !== null ? deserializeValue(data) : undefined 680 }, 681 val: function(value){ 682 if (0 in arguments) { 683 if (value == null) value = "" 684 return this.each(function(idx){ 685 this.value = funcArg(this, value, idx, this.value) 686 }) 687 } else { 688 return this[0] && (this[0].multiple ? 689 $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') : 690 this[0].value) 691 } 692 }, 693 offset: function(coordinates){ 694 if (coordinates) return this.each(function(index){ 695 var $this = $(this), 696 coords = funcArg(this, coordinates, index, $this.offset()), 697 parentOffset = $this.offsetParent().offset(), 698 props = { 699 top: coords.top - parentOffset.top, 700 left: coords.left - parentOffset.left 701 } 702 703 if ($this.css('position') == 'static') props['position'] = 'relative' 704 $this.css(props) 705 }) 706 if (!this.length) return null 707 if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0])) 708 return {top: 0, left: 0} 709 var obj = this[0].getBoundingClientRect() 710 return { 711 left: obj.left + window.pageXOffset, 712 top: obj.top + window.pageYOffset, 713 width: Math.round(obj.width), 714 height: Math.round(obj.height) 715 } 716 }, 717 css: function(property, value){ 718 if (arguments.length < 2) { 719 var element = this[0] 720 if (typeof property == 'string') { 721 if (!element) return 722 return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property) 723 } else if (isArray(property)) { 724 if (!element) return 725 var props = {} 726 var computedStyle = getComputedStyle(element, '') 727 $.each(property, function(_, prop){ 728 props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop)) 729 }) 730 return props 731 } 732 } 733 734 var css = '' 735 if (type(property) == 'string') { 736 if (!value && value !== 0) 737 this.each(function(){ this.style.removeProperty(dasherize(property)) }) 738 else 739 css = dasherize(property) + ":" + maybeAddPx(property, value) 740 } else { 741 for (key in property) 742 if (!property[key] && property[key] !== 0) 743 this.each(function(){ this.style.removeProperty(dasherize(key)) }) 744 else 745 css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';' 746 } 747 748 return this.each(function(){ this.style.cssText += ';' + css }) 749 }, 750 index: function(element){ 751 return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]) 752 }, 753 hasClass: function(name){ 754 if (!name) return false 755 return emptyArray.some.call(this, function(el){ 756 return this.test(className(el)) 757 }, classRE(name)) 758 }, 759 addClass: function(name){ 760 if (!name) return this 761 return this.each(function(idx){ 762 if (!('className' in this)) return 763 classList = [] 764 var cls = className(this), newName = funcArg(this, name, idx, cls) 765 newName.split(/\s+/g).forEach(function(klass){ 766 if (!$(this).hasClass(klass)) classList.push(klass) 767 }, this) 768 classList.length && className(this, cls + (cls ? " " : "") + classList.join(" ")) 769 }) 770 }, 771 removeClass: function(name){ 772 return this.each(function(idx){ 773 if (!('className' in this)) return 774 if (name === undefined) return className(this, '') 775 classList = className(this) 776 funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){ 777 classList = classList.replace(classRE(klass), " ") 778 }) 779 className(this, classList.trim()) 780 }) 781 }, 782 toggleClass: function(name, when){ 783 if (!name) return this 784 return this.each(function(idx){ 785 var $this = $(this), names = funcArg(this, name, idx, className(this)) 786 names.split(/\s+/g).forEach(function(klass){ 787 (when === undefined ? !$this.hasClass(klass) : when) ? 788 $this.addClass(klass) : $this.removeClass(klass) 789 }) 790 }) 791 }, 792 scrollTop: function(value){ 793 if (!this.length) return 794 var hasScrollTop = 'scrollTop' in this[0] 795 if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset 796 return this.each(hasScrollTop ? 797 function(){ this.scrollTop = value } : 798 function(){ this.scrollTo(this.scrollX, value) }) 799 }, 800 scrollLeft: function(value){ 801 if (!this.length) return 802 var hasScrollLeft = 'scrollLeft' in this[0] 803 if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset 804 return this.each(hasScrollLeft ? 805 function(){ this.scrollLeft = value } : 806 function(){ this.scrollTo(value, this.scrollY) }) 807 }, 808 position: function() { 809 if (!this.length) return 810 811 var elem = this[0], 812 // Get *real* offsetParent 813 offsetParent = this.offsetParent(), 814 // Get correct offsets 815 offset = this.offset(), 816 parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset() 817 818 // Subtract element margins 819 // note: when an element has margin: auto the offsetLeft and marginLeft 820 // are the same in Safari causing offset.left to incorrectly be 0 821 offset.top -= parseFloat( $(elem).css('margin-top') ) || 0 822 offset.left -= parseFloat( $(elem).css('margin-left') ) || 0 823 824 // Add offsetParent borders 825 parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0 826 parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0 827 828 // Subtract the two offsets 829 return { 830 top: offset.top - parentOffset.top, 831 left: offset.left - parentOffset.left 832 } 833 }, 834 offsetParent: function() { 835 return this.map(function(){ 836 var parent = this.offsetParent || document.body 837 while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static") 838 parent = parent.offsetParent 839 return parent 840 }) 841 } 842 } 843 844 // for now 845 $.fn.detach = $.fn.remove 846 847 // Generate the `width` and `height` functions 848 ;['width', 'height'].forEach(function(dimension){ 849 var dimensionProperty = 850 dimension.replace(/./, function(m){ return m[0].toUpperCase() }) 851 852 $.fn[dimension] = function(value){ 853 var offset, el = this[0] 854 if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] : 855 isDocument(el) ? el.documentElement['scroll' + dimensionProperty] : 856 (offset = this.offset()) && offset[dimension] 857 else return this.each(function(idx){ 858 el = $(this) 859 el.css(dimension, funcArg(this, value, idx, el[dimension]())) 860 }) 861 } 862 }) 863 864 function traverseNode(node, fun) { 865 fun(node) 866 for (var i = 0, len = node.childNodes.length; i < len; i++) 867 traverseNode(node.childNodes[i], fun) 868 } 869 870 // Generate the `after`, `prepend`, `before`, `append`, 871 // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods. 872 adjacencyOperators.forEach(function(operator, operatorIndex) { 873 var inside = operatorIndex % 2 //=> prepend, append 874 875 $.fn[operator] = function(){ 876 // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings 877 var argType, nodes = $.map(arguments, function(arg) { 878 var arr = [] 879 argType = type(arg) 880 if (argType == "array") { 881 arg.forEach(function(el) { 882 if (el.nodeType !== undefined) return arr.push(el) 883 else if ($.zepto.isZ(el)) return arr = arr.concat(el.get()) 884 arr = arr.concat(zepto.fragment(el)) 885 }) 886 return arr 887 } 888 return argType == "object" || arg == null ? 889 arg : zepto.fragment(arg) 890 }), 891 parent, copyByClone = this.length > 1 892 if (nodes.length < 1) return this 893 894 return this.each(function(_, target){ 895 parent = inside ? target : target.parentNode 896 897 // convert all methods to a "before" operation 898 target = operatorIndex == 0 ? target.nextSibling : 899 operatorIndex == 1 ? target.firstChild : 900 operatorIndex == 2 ? target : 901 null 902 903 var parentInDocument = $.contains(document.documentElement, parent) 904 905 nodes.forEach(function(node){ 906 if (copyByClone) node = node.cloneNode(true) 907 else if (!parent) return $(node).remove() 908 909 parent.insertBefore(node, target) 910 if (parentInDocument) traverseNode(node, function(el){ 911 if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && 912 (!el.type || el.type === 'text/javascript') && !el.src){ 913 var target = el.ownerDocument ? el.ownerDocument.defaultView : window 914 target['eval'].call(target, el.innerHTML) 915 } 916 }) 917 }) 918 }) 919 } 920 921 // after => insertAfter 922 // prepend => prependTo 923 // before => insertBefore 924 // append => appendTo 925 $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){ 926 $(html)[operator](this) 927 return this 928 } 929 }) 930 931 zepto.Z.prototype = Z.prototype = $.fn 932 933 // Export internal API functions in the `$.zepto` namespace 934 zepto.uniq = uniq 935 zepto.deserializeValue = deserializeValue 936 $.zepto = zepto 937 938 return $ 939})() 940 941window.Zepto = Zepto 942window.$ === undefined && (window.$ = Zepto) 943 944;(function($){ 945 var _zid = 1, undefined, 946 slice = Array.prototype.slice, 947 isFunction = $.isFunction, 948 isString = function(obj){ return typeof obj == 'string' }, 949 handlers = {}, 950 specialEvents={}, 951 focusinSupported = 'onfocusin' in window, 952 focus = { focus: 'focusin', blur: 'focusout' }, 953 hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' } 954 955 specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents' 956 957 function zid(element) { 958 return element._zid || (element._zid = _zid++) 959 } 960 function findHandlers(element, event, fn, selector) { 961 event = parse(event) 962 if (event.ns) var matcher = matcherFor(event.ns) 963 return (handlers[zid(element)] || []).filter(function(handler) { 964 return handler 965 && (!event.e || handler.e == event.e) 966 && (!event.ns || matcher.test(handler.ns)) 967 && (!fn || zid(handler.fn) === zid(fn)) 968 && (!selector || handler.sel == selector) 969 }) 970 } 971 function parse(event) { 972 var parts = ('' + event).split('.') 973 return {e: parts[0], ns: parts.slice(1).sort().join(' ')} 974 } 975 function matcherFor(ns) { 976 return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)') 977 } 978 979 function eventCapture(handler, captureSetting) { 980 return handler.del && 981 (!focusinSupported && (handler.e in focus)) || 982 !!captureSetting 983 } 984 985 function realEvent(type) { 986 return hover[type] || (focusinSupported && focus[type]) || type 987 } 988 989 function add(element, events, fn, data, selector, delegator, capture){ 990 var id = zid(element), set = (handlers[id] || (handlers[id] = [])) 991 events.split(/\s/).forEach(function(event){ 992 if (event == 'ready') return $(document).ready(fn) 993 var handler = parse(event) 994 handler.fn = fn 995 handler.sel = selector 996 // emulate mouseenter, mouseleave 997 if (handler.e in hover) fn = function(e){ 998 var related = e.relatedTarget 999 if (!related || (related !== this && !$.contains(this, related))) 1000 return handler.fn.apply(this, arguments) 1001 } 1002 handler.del = delegator 1003 var callback = delegator || fn 1004 handler.proxy = function(e){ 1005 e = compatible(e) 1006 if (e.isImmediatePropagationStopped()) return 1007 e.data = data 1008 var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args)) 1009 if (result === false) e.preventDefault(), e.stopPropagation() 1010 return result 1011 } 1012 handler.i = set.length 1013 set.push(handler) 1014 if ('addEventListener' in element) 1015 element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 1016 }) 1017 } 1018 function remove(element, events, fn, selector, capture){ 1019 var id = zid(element) 1020 ;(events || '').split(/\s/).forEach(function(event){ 1021 findHandlers(element, event, fn, selector).forEach(function(handler){ 1022 delete handlers[id][handler.i] 1023 if ('removeEventListener' in element) 1024 element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 1025 }) 1026 }) 1027 } 1028 1029 $.event = { add: add, remove: remove } 1030 1031 $.proxy = function(fn, context) { 1032 var args = (2 in arguments) && slice.call(arguments, 2) 1033 if (isFunction(fn)) { 1034 var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) } 1035 proxyFn._zid = zid(fn) 1036 return proxyFn 1037 } else if (isString(context)) { 1038 if (args) { 1039 args.unshift(fn[context], fn) 1040 return $.proxy.apply(null, args) 1041 } else { 1042 return $.proxy(fn[context], fn) 1043 } 1044 } else { 1045 throw new TypeError("expected function") 1046 } 1047 } 1048 1049 $.fn.bind = function(event, data, callback){ 1050 return this.on(event, data, callback) 1051 } 1052 $.fn.unbind = function(event, callback){ 1053 return this.off(event, callback) 1054 } 1055 $.fn.one = function(event, selector, data, callback){ 1056 return this.on(event, selector, data, callback, 1) 1057 } 1058 1059 var returnTrue = function(){return true}, 1060 returnFalse = function(){return false}, 1061 ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/, 1062 eventMethods = { 1063 preventDefault: 'isDefaultPrevented', 1064 stopImmediatePropagation: 'isImmediatePropagationStopped', 1065 stopPropagation: 'isPropagationStopped' 1066 } 1067 1068 function compatible(event, source) { 1069 if (source || !event.isDefaultPrevented) { 1070 source || (source = event) 1071 1072 $.each(eventMethods, function(name, predicate) { 1073 var sourceMethod = source[name] 1074 event[name] = function(){ 1075 this[predicate] = returnTrue 1076 return sourceMethod && sourceMethod.apply(source, arguments) 1077 } 1078 event[predicate] = returnFalse 1079 }) 1080 1081 event.timeStamp || (event.timeStamp = Date.now()) 1082 1083 if (source.defaultPrevented !== undefined ? source.defaultPrevented : 1084 'returnValue' in source ? source.returnValue === false : 1085 source.getPreventDefault && source.getPreventDefault()) 1086 event.isDefaultPrevented = returnTrue 1087 } 1088 return event 1089 } 1090 1091 function createProxy(event) { 1092 var key, proxy = { originalEvent: event } 1093 for (key in event) 1094 if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key] 1095 1096 return compatible(proxy, event) 1097 } 1098 1099 $.fn.delegate = function(selector, event, callback){ 1100 return this.on(event, selector, callback) 1101 } 1102 $.fn.undelegate = function(selector, event, callback){ 1103 return this.off(event, selector, callback) 1104 } 1105 1106 $.fn.live = function(event, callback){ 1107 $(document.body).delegate(this.selector, event, callback) 1108 return this 1109 } 1110 $.fn.die = function(event, callback){ 1111 $(document.body).undelegate(this.selector, event, callback) 1112 return this 1113 } 1114 1115 $.fn.on = function(event, selector, data, callback, one){ 1116 var autoRemove, delegator, $this = this 1117 if (event && !isString(event)) { 1118 $.each(event, function(type, fn){ 1119 $this.on(type, selector, data, fn, one) 1120 }) 1121 return $this 1122 } 1123 1124 if (!isString(selector) && !isFunction(callback) && callback !== false) 1125 callback = data, data = selector, selector = undefined 1126 if (callback === undefined || data === false) 1127 callback = data, data = undefined 1128 1129 if (callback === false) callback = returnFalse 1130 1131 return $this.each(function(_, element){ 1132 if (one) autoRemove = function(e){ 1133 remove(element, e.type, callback) 1134 return callback.apply(this, arguments) 1135 } 1136 1137 if (selector) delegator = function(e){ 1138 var evt, match = $(e.target).closest(selector, element).get(0) 1139 if (match && match !== element) { 1140 evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element}) 1141 return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1))) 1142 } 1143 } 1144 1145 add(element, event, callback, data, selector, delegator || autoRemove) 1146 }) 1147 } 1148 $.fn.off = function(event, selector, callback){ 1149 var $this = this 1150 if (event && !isString(event)) { 1151 $.each(event, function(type, fn){ 1152 $this.off(type, selector, fn) 1153 }) 1154 return $this 1155 } 1156 1157 if (!isString(selector) && !isFunction(callback) && callback !== false) 1158 callback = selector, selector = undefined 1159 1160 if (callback === false) callback = returnFalse 1161 1162 return $this.each(function(){ 1163 remove(this, event, callback, selector) 1164 }) 1165 } 1166 1167 $.fn.trigger = function(event, args){ 1168 event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event) 1169 event._args = args 1170 return this.each(function(){ 1171 // handle focus(), blur() by calling them directly 1172 if (event.type in focus && typeof this[event.type] == "function") this[event.type]() 1173 // items in the collection might not be DOM elements 1174 else if ('dispatchEvent' in this) this.dispatchEvent(event) 1175 else $(this).triggerHandler(event, args) 1176 }) 1177 } 1178 1179 // triggers event handlers on current element just as if an event occurred, 1180 // doesn't trigger an actual event, doesn't bubble 1181 $.fn.triggerHandler = function(event, args){ 1182 var e, result 1183 this.each(function(i, element){ 1184 e = createProxy(isString(event) ? $.Event(event) : event) 1185 e._args = args 1186 e.target = element 1187 $.each(findHandlers(element, event.type || event), function(i, handler){ 1188 result = handler.proxy(e) 1189 if (e.isImmediatePropagationStopped()) return false 1190 }) 1191 }) 1192 return result 1193 } 1194 1195 // shortcut methods for `.bind(event, fn)` for each event type 1196 ;('focusin focusout focus blur load resize scroll unload click dblclick '+ 1197 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+ 1198 'change select keydown keypress keyup error').split(' ').forEach(function(event) { 1199 $.fn[event] = function(callback) { 1200 return (0 in arguments) ? 1201 this.bind(event, callback) : 1202 this.trigger(event) 1203 } 1204 }) 1205 1206 $.Event = function(type, props) { 1207 if (!isString(type)) props = type, type = props.type 1208 var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true 1209 if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name]) 1210 event.initEvent(type, bubbles, true) 1211 return compatible(event) 1212 } 1213 1214})(Zepto) 1215 1216;(function($){ 1217 var jsonpID = +new Date(), 1218 document = window.document, 1219 key, 1220 name, 1221 rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, 1222 scriptTypeRE = /^(?:text|application)\/javascript/i, 1223 xmlTypeRE = /^(?:text|application)\/xml/i, 1224 jsonType = 'application/json', 1225 htmlType = 'text/html', 1226 blankRE = /^\s*$/, 1227 originAnchor = document.createElement('a') 1228 1229 originAnchor.href = window.location.href 1230 1231 // trigger a custom event and return false if it was cancelled 1232 function triggerAndReturn(context, eventName, data) { 1233 var event = $.Event(eventName) 1234 $(context).trigger(event, data) 1235 return !event.isDefaultPrevented() 1236 } 1237 1238 // trigger an Ajax "global" event 1239 function triggerGlobal(settings, context, eventName, data) { 1240 if (settings.global) return triggerAndReturn(context || document, eventName, data) 1241 } 1242 1243 // Number of active Ajax requests 1244 $.active = 0 1245 1246 function ajaxStart(settings) { 1247 if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart') 1248 } 1249 function ajaxStop(settings) { 1250 if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop') 1251 } 1252 1253 // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable 1254 function ajaxBeforeSend(xhr, settings) { 1255 var context = settings.context 1256 if (settings.beforeSend.call(context, xhr, settings) === false || 1257 triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) 1258 return false 1259 1260 triggerGlobal(settings, context, 'ajaxSend', [xhr, settings]) 1261 } 1262 function ajaxSuccess(data, xhr, settings, deferred) { 1263 var context = settings.context, status = 'success' 1264 settings.success.call(context, data, status, xhr) 1265 if (deferred) deferred.resolveWith(context, [data, status, xhr]) 1266 triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]) 1267 ajaxComplete(status, xhr, settings) 1268 } 1269 // type: "timeout", "error", "abort", "parsererror" 1270 function ajaxError(error, type, xhr, settings, deferred) { 1271 var context = settings.context 1272 settings.error.call(context, xhr, type, error) 1273 if (deferred) deferred.rejectWith(context, [xhr, type, error]) 1274 triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type]) 1275 ajaxComplete(type, xhr, settings) 1276 } 1277 // status: "success", "notmodified", "error", "timeout", "abort", "parsererror" 1278 function ajaxComplete(status, xhr, settings) { 1279 var context = settings.context 1280 settings.complete.call(context, xhr, status) 1281 triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]) 1282 ajaxStop(settings) 1283 } 1284 1285 function ajaxDataFilter(data, type, settings) { 1286 if (settings.dataFilter == empty) return data 1287 var context = settings.context 1288 return settings.dataFilter.call(context, data, type) 1289 } 1290 1291 // Empty function, used as default callback 1292 function empty() {} 1293 1294 $.ajaxJSONP = function(options, deferred){ 1295 if (!('type' in options)) return $.ajax(options) 1296 1297 var _callbackName = options.jsonpCallback, 1298 callbackName = ($.isFunction(_callbackName) ? 1299 _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)), 1300 script = document.createElement('script'), 1301 originalCallback = window[callbackName], 1302 responseData, 1303 abort = function(errorType) { 1304 $(script).triggerHandler('error', errorType || 'abort') 1305 }, 1306 xhr = { abort: abort }, abortTimeout 1307 1308 if (deferred) deferred.promise(xhr) 1309 1310 $(script).on('load error', function(e, errorType){ 1311 clearTimeout(abortTimeout) 1312 $(script).off().remove() 1313 1314 if (e.type == 'error' || !responseData) { 1315 ajaxError(null, errorType || 'error', xhr, options, deferred) 1316 } else { 1317 ajaxSuccess(responseData[0], xhr, options, deferred) 1318 } 1319 1320 window[callbackName] = originalCallback 1321 if (responseData && $.isFunction(originalCallback)) 1322 originalCallback(responseData[0]) 1323 1324 originalCallback = responseData = undefined 1325 }) 1326 1327 if (ajaxBeforeSend(xhr, options) === false) { 1328 abort('abort') 1329 return xhr 1330 } 1331 1332 window[callbackName] = function(){ 1333 responseData = arguments 1334 } 1335 1336 script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName) 1337 document.head.appendChild(script) 1338 1339 if (options.timeout > 0) abortTimeout = setTimeout(function(){ 1340 abort('timeout') 1341 }, options.timeout) 1342 1343 return xhr 1344 } 1345 1346 $.ajaxSettings = { 1347 // Default type of request 1348 type: 'GET', 1349 // Callback that is executed before request 1350 beforeSend: empty, 1351 // Callback that is executed if the request succeeds 1352 success: empty, 1353 // Callback that is executed the the server drops error 1354 error: empty, 1355 // Callback that is executed on request complete (both: error and success) 1356 complete: empty, 1357 // The context for the callbacks 1358 context: null, 1359 // Whether to trigger "global" Ajax events 1360 global: true, 1361 // Transport 1362 xhr: function () { 1363 return new window.XMLHttpRequest() 1364 }, 1365 // MIME types mapping 1366 // IIS returns Javascript as "application/x-javascript" 1367 accepts: { 1368 script: 'text/javascript, application/javascript, application/x-javascript', 1369 json: jsonType, 1370 xml: 'application/xml, text/xml', 1371 html: htmlType, 1372 text: 'text/plain' 1373 }, 1374 // Whether the request is to another domain 1375 crossDomain: false, 1376 // Default timeout 1377 timeout: 0, 1378 // Whether data should be serialized to string 1379 processData: true, 1380 // Whether the browser should be allowed to cache GET responses 1381 cache: false, //hack xuetangx 黿¢ç¼åï¼ååºé»è®¤å¼ä¸ºtrueï¼å 许ç¼åï¼, 1382 //Used to handle the raw response data of XMLHttpRequest. 1383 //This is a pre-filtering function to sanitize the response. 1384 //The sanitized response should be returned 1385 dataFilter: empty 1386 } 1387 1388 function mimeToDataType(mime) { 1389 if (mime) mime = mime.split(';', 2)[0] 1390 return mime && ( mime == htmlType ? 'html' : 1391 mime == jsonType ? 'json' : 1392 scriptTypeRE.test(mime) ? 'script' : 1393 xmlTypeRE.test(mime) && 'xml' ) || 'text' 1394 } 1395 1396 function appendQuery(url, query) { 1397 if (query == '') return url 1398 return (url + '&' + query).replace(/[&?]{1,2}/, '?') 1399 } 1400 1401 // serialize payload and append it to the URL for GET requests 1402 function serializeData(options) { 1403 if (options.processData && options.data && $.type(options.data) != "string") 1404 options.data = $.param(options.data, options.traditional) 1405 if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType)) 1406 options.url = appendQuery(options.url, options.data), options.data = undefined 1407 } 1408 1409 $.ajax = function(options){ 1410 var settings = $.extend({}, options || {}), 1411 deferred = $.Deferred && $.Deferred(), 1412 urlAnchor, hashIndex 1413 for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key] 1414 1415 ajaxStart(settings) 1416 1417 if (!settings.crossDomain) { 1418 urlAnchor = document.createElement('a') 1419 urlAnchor.href = settings.url 1420 // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049 1421 urlAnchor.href = urlAnchor.href 1422 settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host) 1423 } 1424 1425 if (!settings.url) settings.url = window.location.toString() 1426 if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex) 1427 serializeData(settings) 1428 1429 var dataType = settings.dataType, hasPlaceholder = /\?.+=\?/.test(settings.url) 1430 if (hasPlaceholder) dataType = 'jsonp' 1431 1432 if (settings.cache === false || ( 1433 (!options || options.cache !== true) && 1434 ('script' == dataType || 'jsonp' == dataType) 1435 )) 1436 settings.url = appendQuery(settings.url, '_=' + Date.now()) 1437 1438 if ('jsonp' == dataType) { 1439 if (!hasPlaceholder) 1440 settings.url = appendQuery(settings.url, 1441 settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?') 1442 return $.ajaxJSONP(settings, deferred) 1443 } 1444 1445 var mime = settings.accepts[dataType], 1446 headers = { }, 1447 setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] }, 1448 protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, 1449 xhr = settings.xhr(), 1450 nativeSetHeader = xhr.setRequestHeader, 1451 abortTimeout 1452 1453 if (deferred) deferred.promise(xhr) 1454 1455 if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest') 1456 setHeader('Accept', mime || '*/*') 1457 if (mime = settings.mimeType || mime) { 1458 if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0] 1459 xhr.overrideMimeType && xhr.overrideMimeType(mime) 1460 } 1461 if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET')) 1462 setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded') 1463 1464 if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name]) 1465 xhr.setRequestHeader = setHeader 1466 1467 xhr.onreadystatechange = function(){ 1468 if (xhr.readyState == 4) { 1469 xhr.onreadystatechange = empty 1470 clearTimeout(abortTimeout) 1471 var result, error = false 1472 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) { 1473 dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type')) 1474 1475 if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob') 1476 result = xhr.response 1477 else { 1478 result = xhr.responseText 1479 1480 try { 1481 // http://perfectionkills.com/global-eval-what-are-the-options/ 1482 // sanitize response accordingly if data filter callback provided 1483 result = ajaxDataFilter(result, dataType, settings) 1484 if (dataType == 'script') (1,eval)(result) 1485 else if (dataType == 'xml') result = xhr.responseXML 1486 else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result) 1487 } catch (e) { error = e } 1488 1489 if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred) 1490 } 1491 1492 ajaxSuccess(result, xhr, settings, deferred) 1493 } else { 1494 ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred) 1495 } 1496 } 1497 } 1498 1499 if (ajaxBeforeSend(xhr, settings) === false) { 1500 xhr.abort() 1501 ajaxError(null, 'abort', xhr, settings, deferred) 1502 return xhr 1503 } 1504 1505 var async = 'async' in settings ? settings.async : true 1506 xhr.open(settings.type, settings.url, async, settings.username, settings.password) 1507 1508 if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name] 1509 1510 for (name in headers) nativeSetHeader.apply(xhr, headers[name]) 1511 1512 if (settings.timeout > 0) abortTimeout = setTimeout(function(){ 1513 xhr.onreadystatechange = empty 1514 xhr.abort() 1515 ajaxError(null, 'timeout', xhr, settings, deferred) 1516 }, settings.timeout) 1517 1518 // avoid sending empty string (#319) 1519 xhr.send(settings.data ? settings.data : null) 1520 return xhr 1521 } 1522 1523 // handle optional data/success arguments 1524 function parseArguments(url, data, success, dataType) { 1525 if ($.isFunction(data)) dataType = success, success = data, data = undefined 1526 if (!$.isFunction(success)) dataType = success, success = undefined 1527 return { 1528 url: url 1529 , data: data 1530 , success: success 1531 , dataType: dataType 1532 } 1533 } 1534 1535 $.get = function(/* url, data, success, dataType */){
1536 return $.ajax(parseArguments.apply(null, arguments)) 1537 } 1538 1539 $.post = function(/* url, data, success, dataType */){ 1540 var options = parseArguments.apply(null, arguments) 1541 options.type = 'POST' 1542 return $.ajax(options) 1543 } 1544 1545 $.getJSON = function(/* url, data, success */){ 1546 var options = parseArguments.apply(null, arguments) 1547 options.dataType = 'json' 1548 return $.ajax(options) 1549 } 1550 1551 $.fn.load = function(url, data, success){ 1552 if (!this.length) return this 1553 var self = this, parts = url.split(/\s/), selector, 1554 options = parseArguments(url, data, success), 1555 callback = options.success 1556 if (parts.length > 1) options.url = parts[0], selector = parts[1] 1557 options.success = function(response){ 1558 self.html(selector ? 1559 $('<div>').html(response.replace(rscript, "")).find(selector) 1560 : response) 1561 callback && callback.apply(self, arguments) 1562 } 1563 $.ajax(options) 1564 return this 1565 } 1566 1567 var escape = encodeURIComponent 1568 1569 function serialize(params, obj, traditional, scope){ 1570 var type, array = $.isArray(obj), hash = $.isPlainObject(obj) 1571 $.each(obj, function(key, value) { 1572 type = $.type(value) 1573 if (scope) key = traditional ? scope : 1574 scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']' 1575 // handle data in serializeArray() format 1576 if (!scope && array) params.add(value.name, value.value) 1577 // recurse into nested objects 1578 else if (type == "array" || (!traditional && type == "object")) 1579 serialize(params, value, traditional, key) 1580 else params.add(key, value) 1581 }) 1582 } 1583 1584 $.param = function(obj, traditional){ 1585 var params = [] 1586 params.add = function(key, value) { 1587 if ($.isFunction(value)) value = value() 1588 if (value == null) value = "" 1589 this.push(escape(key) + '=' + escape(value)) 1590 } 1591 serialize(params, obj, traditional) 1592 return params.join('&').replace(/%20/g, '+') 1593 } 1594})(Zepto) 1595 1596;(function($){ 1597 $.fn.serializeArray = function() { 1598 var name, type, result = [], 1599 add = function(value) { 1600 if (value.forEach) return value.forEach(add) 1601 result.push({ name: name, value: value }) 1602 } 1603 if (this[0]) $.each(this[0].elements, function(_, field){ 1604 type = field.type, name = field.name 1605 if (name && field.nodeName.toLowerCase() != 'fieldset' && 1606 !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' && 1607 ((type != 'radio' && type != 'checkbox') || field.checked)) 1608 add($(field).val()) 1609 }) 1610 return result 1611 } 1612 1613 $.fn.serialize = function(){ 1614 var result = [] 1615 this.serializeArray().forEach(function(elm){ 1616 result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value)) 1617 }) 1618 return result.join('&') 1619 } 1620 1621 $.fn.submit = function(callback) { 1622 if (0 in arguments) this.bind('submit', callback) 1623 else if (this.length) { 1624 var event = $.Event('submit') 1625 this.eq(0).trigger(event) 1626 if (!event.isDefaultPrevented()) this.get(0).submit() 1627 } 1628 return this 1629 } 1630 1631})(Zepto) 1632 1633 1634// Zepto.js 1635// (c) 2010-2016 Thomas Fuchs 1636// Zepto.js may be freely distributed under the MIT license. 1637 1638;(function($, undefined){ 1639 var prefix = '', eventPrefix, 1640 vendors = { Webkit: 'webkit', Moz: '', O: 'o' }, 1641 testEl = document.createElement('div'), 1642 supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i, 1643 transform, 1644 transitionProperty, transitionDuration, transitionTiming, transitionDelay, 1645 animationName, animationDuration, animationTiming, animationDelay, 1646 cssReset = {} 1647 1648 function dasherize(str) { return str.replace(/([A-Z])/g, '-$1').toLowerCase() } 1649 function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : name.toLowerCase() } 1650 1651 if (testEl.style.transform === undefined) $.each(vendors, function(vendor, event){ 1652 if (testEl.style[vendor + 'TransitionProperty'] !== undefined) { 1653 prefix = '-' + vendor.toLowerCase() + '-' 1654 eventPrefix = event 1655 return false 1656 } 1657 }) 1658 1659 transform = prefix + 'transform' 1660 cssReset[transitionProperty = prefix + 'transition-property'] = 1661 cssReset[transitionDuration = prefix + 'transition-duration'] = 1662 cssReset[transitionDelay = prefix + 'transition-delay'] = 1663 cssReset[transitionTiming = prefix + 'transition-timing-function'] = 1664 cssReset[animationName = prefix + 'animation-name'] = 1665 cssReset[animationDuration = prefix + 'animation-duration'] = 1666 cssReset[animationDelay = prefix + 'animation-delay'] = 1667 cssReset[animationTiming = prefix + 'animation-timing-function'] = '' 1668 1669 $.fx = { 1670 off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined), 1671 speeds: { _default: 400, fast: 200, slow: 600 }, 1672 cssPrefix: prefix, 1673 transitionEnd: normalizeEvent('TransitionEnd'), 1674 animationEnd: normalizeEvent('AnimationEnd') 1675 } 1676 1677 $.fn.animate = function(properties, duration, ease, callback, delay){ 1678 if ($.isFunction(duration)) 1679 callback = duration, ease = undefined, duration = undefined 1680 if ($.isFunction(ease)) 1681 callback = ease, ease = undefined 1682 if ($.isPlainObject(duration)) 1683 ease = duration.easing, callback = duration.complete, delay = duration.delay, duration = duration.duration 1684 if (duration) duration = (typeof duration == 'number' ? duration : 1685 ($.fx.speeds[duration] || $.fx.speeds._default)) / 1000 1686 if (delay) delay = parseFloat(delay) / 1000 1687 return this.anim(properties, duration, ease, callback, delay) 1688 } 1689 1690 $.fn.anim = function(properties, duration, ease, callback, delay){ 1691 var key, cssValues = {}, cssProperties, transforms = '', 1692 that = this, wrappedCallback, endEvent = $.fx.transitionEnd, 1693 fired = false 1694 1695 if (duration === undefined) duration = $.fx.speeds._default / 1000 1696 if (delay === undefined) delay = 0 1697 if ($.fx.off) duration = 0 1698 1699 if (typeof properties == 'string') { 1700 // keyframe animation 1701 cssValues[animationName] = properties 1702 cssValues[animationDuration] = duration + 's' 1703 cssValues[animationDelay] = delay + 's' 1704 cssValues[animationTiming] = (ease || 'linear') 1705 endEvent = $.fx.animationEnd 1706 } else { 1707 cssProperties = [] 1708 // CSS transitions 1709 for (key in properties) 1710 if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') ' 1711 else cssValues[key] = properties[key], cssProperties.push(dasherize(key)) 1712 1713 if (transforms) cssValues[transform] = transforms, cssProperties.push(transform) 1714 if (duration > 0 && typeof properties === 'object') { 1715 cssValues[transitionProperty] = cssProperties.join(', ') 1716 cssValues[transitionDuration] = duration + 's' 1717 cssValues[transitionDelay] = delay + 's' 1718 cssValues[transitionTiming] = (ease || 'linear') 1719 } 1720 } 1721 1722 wrappedCallback = function(event){ 1723 if (typeof event !== 'undefined') { 1724 if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from "below" 1725 $(event.target).unbind(endEvent, wrappedCallback) 1726 } else 1727 $(this).unbind(endEvent, wrappedCallback) // triggered by setTimeout 1728 1729 fired = true 1730 $(this).css(cssReset) 1731 callback && callback.call(this) 1732 } 1733 if (duration > 0){ 1734 this.bind(endEvent, wrappedCallback)
1735 // transitionEnd is not always firing on older Android phones 1736 // so make sure it gets fired 1737 setTimeout(function(){ 1738 if (fired) return 1739 wrappedCallback.call(that) 1740 }, ((duration + delay) * 1000) + 25) 1741 } 1742 1743 // trigger page reflow so new elements can animate 1744 this.size() && this.get(0).clientLeft 1745 1746 this.css(cssValues) 1747 1748 if (duration <= 0) setTimeout(function() { 1749 that.each(function(){ wrappedCallback.call(this) }) 1750 }, 0) 1751 1752 return this 1753 } 1754 1755 testEl = null 1756})(Zepto) 1757 1758// Zepto.js 1759// (c) 2010-2016 Thomas Fuchs 1760// Zepto.js may be freely distributed under the MIT license. 1761 1762;(function($, undefined){ 1763 var document = window.document, docElem = document.documentElement, 1764 origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle 1765 1766 function anim(el, speed, opacity, scale, callback) { 1767 if (typeof speed == 'function' && !callback) callback = speed, speed = undefined 1768 var props = { opacity: opacity } 1769 if (scale) { 1770 props.scale = scale 1771 el.css($.fx.cssPrefix + 'transform-origin', '0 0') 1772 } 1773 return el.animate(props, speed, null, callback) 1774 } 1775 1776 function hide(el, speed, scale, callback) { 1777 return anim(el, speed, 0, scale, function(){ 1778 origHide.call($(this)) 1779 callback && callback.call(this) 1780 }) 1781 } 1782 1783 $.fn.show = function(speed, callback) { 1784 origShow.call(this) 1785 if (speed === undefined) speed = 0 1786 else this.css('opacity', 0) 1787 return anim(this, speed, 1, '1,1', callback) 1788 } 1789 1790 $.fn.hide = function(speed, callback) { 1791 if (speed === undefined) return origHide.call(this) 1792 else return hide(this, speed, '0,0', callback) 1793 } 1794 1795 $.fn.toggle = function(speed, callback) { 1796 if (speed === undefined || typeof speed == 'boolean') 1797 return origToggle.call(this, speed) 1798 else return this.each(function(){ 1799 var el = $(this) 1800 el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback) 1801 }) 1802 } 1803 1804 $.fn.fadeTo = function(speed, opacity, callback) { 1805 return anim(this, speed, opacity, null, callback) 1806 } 1807 1808 $.fn.fadeIn = function(speed, callback) { 1809 var target = this.css('opacity') 1810 if (target > 0) this.css('opacity', 0) 1811 else target = 1 1812 return origShow.call(this).fadeTo(speed, target, callback) 1813 } 1814 1815 $.fn.fadeOut = function(speed, callback) { 1816 return hide(this, speed, null, callback) 1817 } 1818 1819 $.fn.fadeToggle = function(speed, callback) { 1820 return this.each(function(){ 1821 var el = $(this) 1822 el[ 1823 (el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut' 1824 ](speed, callback) 1825 }) 1826 } 1827 1828})(Zepto) 1829 1830// Zepto.js 1831// (c) 2010-2016 Thomas Fuchs 1832// Zepto.js may be freely distributed under the MIT license. 1833 1834;(function($){ 1835 var touch = {}, 1836 touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, 1837 longTapDelay = 750, 1838 gesture 1839 1840 function swipeDirection(x1, x2, y1, y2) { 1841 return Math.abs(x1 - x2) >= 1842 Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down') 1843 } 1844 1845 function longTap() { 1846 longTapTimeout = null 1847 if (touch.last) { 1848 touch.el.trigger('longTap') 1849 touch = {} 1850 } 1851 } 1852 1853 function cancelLongTap() { 1854 if (longTapTimeout) clearTimeout(longTapTimeout) 1855 longTapTimeout = null 1856 } 1857 1858 function cancelAll() { 1859 if (touchTimeout) clearTimeout(touchTimeout) 1860 if (tapTimeout) clearTimeout(tapTimeout) 1861 if (swipeTimeout) clearTimeout(swipeTimeout) 1862 if (longTapTimeout) clearTimeout(longTapTimeout) 1863 touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null 1864 touch = {} 1865 } 1866 1867 function isPrimaryTouch(event){ 1868 return (event.pointerType == 'touch' || 1869 event.pointerType == event.MSPOINTER_TYPE_TOUCH) 1870 && event.isPrimary 1871 } 1872 1873 function isPointerEventType(e, type){ 1874 return (e.type == 'pointer'+type || 1875 e.type.toLowerCase() == 'mspointer'+type) 1876 } 1877 1878 $(document).ready(function(){ 1879 var now, delta, deltaX = 0, deltaY = 0, firstTouch, _isPointerType 1880 1881 if ('MSGesture' in window) { 1882 gesture = new MSGesture() 1883 gesture.target = document.body 1884 } 1885 1886 $(document) 1887 .bind('MSGestureEnd', function(e){
1888 var swipeDirectionFromVelocity = 1889 e.velocityX > 1 ? 'Right' : e.velocityX < -1 ? 'Left' : e.velocityY > 1 ? 'Down' : e.velocityY < -1 ? 'Up' : null 1890 if (swipeDirectionFromVelocity) { 1891 touch.el.trigger('swipe') 1892 touch.el.trigger('swipe'+ swipeDirectionFromVelocity) 1893 } 1894 }) 1895 .on('touchstart MSPointerDown pointerdown', function(e){ 1896 if((_isPointerType = isPointerEventType(e, 'down')) && 1897 !isPrimaryTouch(e)) return 1898 firstTouch = _isPointerType ? e : e.touches[0] 1899 if (e.touches && e.touches.length === 1 && touch.x2) { 1900 // Clear out touch movement data if we have it sticking around 1901 // This can occur if touchcancel doesn't fire due to preventDefault, etc. 1902 touch.x2 = undefined 1903 touch.y2 = undefined 1904 } 1905 now = Date.now() 1906 delta = now - (touch.last || now) 1907 touch.el = $('tagName' in firstTouch.target ? 1908 firstTouch.target : firstTouch.target.parentNode) 1909 touchTimeout && clearTimeout(touchTimeout) 1910 touch.x1 = firstTouch.pageX 1911 touch.y1 = firstTouch.pageY 1912 if (delta > 0 && delta <= 250) touch.isDoubleTap = true 1913 touch.last = now 1914 longTapTimeout = setTimeout(longTap, longTapDelay) 1915 // adds the current touch contact for IE gesture recognition 1916 if (gesture && _isPointerType) gesture.addPointer(e.pointerId) 1917 }) 1918 .on('touchmove MSPointerMove pointermove', function(e){ 1919 if((_isPointerType = isPointerEventType(e, 'move')) && 1920 !isPrimaryTouch(e)) return 1921 firstTouch = _isPointerType ? e : e.touches[0] 1922 cancelLongTap() 1923 touch.x2 = firstTouch.pageX 1924 touch.y2 = firstTouch.pageY 1925 1926 deltaX += Math.abs(touch.x1 - touch.x2) 1927 deltaY += Math.abs(touch.y1 - touch.y2) 1928 }) 1929 .on('touchend MSPointerUp pointerup', function(e){ 1930 if((_isPointerType = isPointerEventType(e, 'up')) && 1931 !isPrimaryTouch(e)) return 1932 cancelLongTap() 1933 1934 // swipe 1935 if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || 1936 (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)) 1937 1938 swipeTimeout = setTimeout(function() { 1939 if (touch.el){ 1940 touch.el.trigger('swipe') 1941 touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2))) 1942 } 1943 touch = {} 1944 }, 0) 1945 1946 // normal tap 1947 else if ('last' in touch) 1948 // don't fire tap when delta position changed by more than 30 pixels, 1949 // for instance when moving to a point and back to origin 1950 if (deltaX < 30 && deltaY < 30) { 1951 // delay by one tick so we can cancel the 'tap' event if 'scroll' fires 1952 // ('tap' fires before 'scroll') 1953 tapTimeout = setTimeout(function() { 1954 1955 // trigger universal 'tap' with the option to cancelTouch() 1956 // (cancelTouch cancels processing of single vs double taps for faster 'tap' response) 1957 var event = $.Event('tap') 1958 event.cancelTouch = cancelAll 1959 // [by paper] fix -> "TypeError: 'undefined' is not an object (evaluating 'touch.el.trigger'), when double tap 1960 if (touch.el) touch.el.trigger(event) 1961 1962 // trigger double tap immediately 1963 if (touch.isDoubleTap) { 1964 if (touch.el) touch.el.trigger('doubleTap') 1965 touch = {} 1966 } 1967 1968 // trigger single tap after 250ms of inactivity 1969 else { 1970 touchTimeout = setTimeout(function(){ 1971 touchTimeout = null 1972 if (touch.el) touch.el.trigger('singleTap') 1973 touch = {} 1974 }, 250) 1975 } 1976 }, 0) 1977 } else { 1978 touch = {} 1979 } 1980 deltaX = deltaY = 0 1981 1982 }) 1983 // when the browser window loses focus, 1984 // for example when a modal dialog is shown, 1985 // cancel all ongoing events 1986 .on('touchcancel MSPointerCancel pointercancel', cancelAll) 1987 1988 // scrolling the window indicates intention of the user 1989 // to scroll, not tap or swipe, so cancel all ongoing events 1990 $(window).on('scroll', cancelAll) 1991 }) 1992 1993 ;['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 1994 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){ 1995 $.fn[eventName] = function(callback){ return this.on(eventName, callback) } 1996 }) 1997})(Zepto) 1998 1999// Zepto.js 2000// (c) 2010-2016 Thomas Fuchs 2001// Zepto.js may be freely distributed under the MIT license. 2002 2003;(function($){ 2004 // Create a collection of callbacks to be fired in a sequence, with configurable behaviour 2005 // Option flags: 2006 // - once: Callbacks fired at most one time. 2007 // - memory: Remember the most recent context and arguments 2008 // - stopOnFalse: Cease iterating over callback list 2009 // - unique: Permit adding at most one instance of the same callback 2010 $.Callbacks = function(options) { 2011 options = $.extend({}, options) 2012 2013 var memory, // Last fire value (for non-forgettable lists) 2014 fired, // Flag to know if list was already fired 2015 firing, // Flag to know if list is currently firing 2016 firingStart, // First callback to fire (used internally by add and fireWith) 2017 firingLength, // End of the loop when firing 2018 firingIndex, // Index of currently firing callback (modified by remove if needed) 2019 list = [], // Actual callback list
vendor: 7,717 bytes, lines 2020-2258
2020 stack = !options.once && [], // Stack of fire calls for repeatable lists 2021 fire = function(data) { 2022 memory = options.memory && data 2023 fired = true 2024 firingIndex = firingStart || 0 2025 firingStart = 0 2026 firingLength = list.length 2027 firing = true 2028 for ( ; list && firingIndex < firingLength ; ++firingIndex ) { 2029 if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) { 2030 memory = false 2031 break 2032 } 2033 } 2034 firing = false 2035 if (list) { 2036 if (stack) stack.length && fire(stack.shift()) 2037 else if (memory) list.length = 0 2038 else Callbacks.disable() 2039 } 2040 }, 2041 2042 Callbacks = { 2043 add: function() { 2044 if (list) { 2045 var start = list.length, 2046 add = function(args) { 2047 $.each(args, function(_, arg){ 2048 if (typeof arg === "function") { 2049 if (!options.unique || !Callbacks.has(arg)) list.push(arg) 2050 } 2051 else if (arg && arg.length && typeof arg !== 'string') add(arg) 2052 }) 2053 } 2054 add(arguments) 2055 if (firing) firingLength = list.length 2056 else if (memory) { 2057 firingStart = start 2058 fire(memory) 2059 } 2060 } 2061 return this 2062 }, 2063 remove: function() { 2064 if (list) { 2065 $.each(arguments, function(_, arg){ 2066 var index 2067 while ((index = $.inArray(arg, list, index)) > -1) { 2068 list.splice(index, 1) 2069 // Handle firing indexes 2070 if (firing) { 2071 if (index <= firingLength) --firingLength 2072 if (index <= firingIndex) --firingIndex 2073 } 2074 } 2075 }) 2076 } 2077 return this 2078 }, 2079 has: function(fn) { 2080 return !!(list && (fn ? $.inArray(fn, list) > -1 : list.length)) 2081 }, 2082 empty: function() { 2083 firingLength = list.length = 0 2084 return this 2085 }, 2086 disable: function() { 2087 list = stack = memory = undefined 2088 return this 2089 }, 2090 disabled: function() { 2091 return !list 2092 }, 2093 lock: function() { 2094 stack = undefined 2095 if (!memory) Callbacks.disable() 2096 return this 2097 }, 2098 locked: function() { 2099 return !stack 2100 }, 2101 fireWith: function(context, args) { 2102 if (list && (!fired || stack)) { 2103 args = args || [] 2104 args = [context, args.slice ? args.slice() : args] 2105 if (firing) stack.push(args) 2106 else fire(args) 2107 } 2108 return this 2109 }, 2110 fire: function() { 2111 return Callbacks.fireWith(this, arguments) 2112 }, 2113 fired: function() { 2114 return !!fired 2115 } 2116 } 2117 2118 return Callbacks 2119 } 2120})(Zepto) 2121 2122// Zepto.js 2123// (c) 2010-2016 Thomas Fuchs 2124// Zepto.js may be freely distributed under the MIT license. 2125// 2126// Some code (c) 2005, 2013 jQuery Foundation, Inc. and other contributors 2127 2128;(function($){ 2129 var slice = Array.prototype.slice 2130 2131 function Deferred(func) { 2132 var tuples = [ 2133 // action, add listener, listener list, final state 2134 [ "resolve", "done", $.Callbacks({once:1, memory:1}), "resolved" ], 2135 [ "reject", "fail", $.Callbacks({once:1, memory:1}), "rejected" ], 2136 [ "notify", "progress", $.Callbacks({memory:1}) ] 2137 ], 2138 state = "pending", 2139 promise = { 2140 state: function() { 2141 return state 2142 }, 2143 always: function() { 2144 deferred.done(arguments).fail(arguments) 2145 return this 2146 }, 2147 then: function(/* fnDone [, fnFailed [, fnProgress]] */) { 2148 var fns = arguments 2149 return Deferred(function(defer){ 2150 $.each(tuples, function(i, tuple){ 2151 var fn = $.isFunction(fns[i]) && fns[i] 2152 deferred[tuple[1]](function(){ 2153 var returned = fn && fn.apply(this, arguments) 2154 if (returned && $.isFunction(returned.promise)) { 2155 returned.promise() 2156 .done(defer.resolve) 2157 .fail(defer.reject) 2158 .progress(defer.notify) 2159 } else { 2160 var context = this === promise ? defer.promise() : this, 2161 values = fn ? [returned] : arguments 2162 defer[tuple[0] + "With"](context, values) 2163 } 2164 }) 2165 }) 2166 fns = null 2167 }).promise() 2168 }, 2169 2170 promise: function(obj) { 2171 return obj != null ? $.extend( obj, promise ) : promise 2172 } 2173 }, 2174 deferred = {} 2175 2176 $.each(tuples, function(i, tuple){ 2177 var list = tuple[2], 2178 stateString = tuple[3] 2179 2180 promise[tuple[1]] = list.add 2181 2182 if (stateString) { 2183 list.add(function(){ 2184 state = stateString 2185 }, tuples[i^1][2].disable, tuples[2][2].lock) 2186 } 2187 2188 deferred[tuple[0]] = function(){ 2189 deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments) 2190 return this 2191 } 2192 deferred[tuple[0] + "With"] = list.fireWith 2193 }) 2194 2195 promise.promise(deferred) 2196 if (func) func.call(deferred, deferred) 2197 return deferred 2198 } 2199 2200 $.when = function(sub) { 2201 var resolveValues = slice.call(arguments), 2202 len = resolveValues.length, 2203 i = 0, 2204 remain = len !== 1 || (sub && $.isFunction(sub.promise)) ? len : 0, 2205 deferred = remain === 1 ? sub : Deferred(), 2206 progressValues, progressContexts, resolveContexts, 2207 updateFn = function(i, ctx, val){ 2208 return function(value){ 2209 ctx[i] = this 2210 val[i] = arguments.length > 1 ? slice.call(arguments) : value 2211 if (val === progressValues) { 2212 deferred.notifyWith(ctx, val) 2213 } else if (!(--remain)) { 2214 deferred.resolveWith(ctx, val) 2215 } 2216 } 2217 } 2218 2219 if (len > 1) { 2220 progressValues = new Array(len) 2221 progressContexts = new Array(len) 2222 resolveContexts = new Array(len) 2223 for ( ; i < len; ++i ) { 2224 if (resolveValues[i] && $.isFunction(resolveValues[i].promise)) { 2225 resolveValues[i].promise() 2226 .done(updateFn(i, resolveContexts, resolveValues)) 2227 .fail(deferred.reject) 2228 .progress(updateFn(i, progressContexts, progressValues)) 2229 } else { 2230 --remain 2231 } 2232 } 2233 } 2234 if (!remain) deferred.resolveWith(resolveContexts, resolveValues) 2235 return deferred.promise() 2236 } 2237 2238 $.Deferred = Deferred 2239})(Zepto) 2240 2241;(function(){ 2242 // getComputedStyle shouldn't freak out when called 2243 // without a valid element as argument 2244 try { 2245 getComputedStyle(undefined) 2246 } catch(e) { 2247 var nativeGetComputedStyle = getComputedStyle 2248 window.getComputedStyle = function(element, pseudoElement){ 2249 try { 2250 return nativeGetComputedStyle(element, pseudoElement) 2251 } catch(e) { 2252 return null 2253 } 2254 } 2255 } 2256})() 2257 return Zepto 2258}))
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.