下面我为大家介绍一款小游戏飞机吃金币~ ~~~
HTML部分:
<link rel="stylesheet" type="text/css" href="css/default.css">
<body>
<div class="panel">
<header class="htmleaf-header">
<h1>小游戏</h1>
</header>
<p class="profit">
得分:$<span>0</span>
</p>
<p><strong>WASD</strong> 或者 ↑ ↓ ← → 控制飞行</p>
</div>
<script src='js/jquery.min.js'></script>
<script src='js/sketch.min.js'></script>
<script>
(function() {
var Coin, Ship, shipImg;
shipImg = new Image();
shipImg.src = 'img/rocket-sprite.png';
Ship = (function() {
function Ship(ctx) {
this.width = shipImg.width;
this.height = shipImg.height;
this.halfWidth = this.width / 2;
this.halfHeight = this.height / 2;
this.x = (ctx.width / 2) - this.halfWidth;
this.y = (ctx.height / 2) - this.halfHeight;
this.maxLength = max(this.width, this.height);
this.diagLength = sqrt(this.halfWidth * this.halfWidth + this.halfHeight * this.halfHeight);
this.rotationSpeed = 0.05;
this.rotation = 0;
this.vx = 0;
this.vy = 0;
this.thrust = 0;
}
Ship.prototype.update = function(ctx) {
var ax, ay;
if (ctx.keys[87] || ctx.keys[38]) {
this.thrust = 0.15;
} else {
this.thrust = 0;
}
if (ctx.keys[68] || ctx.keys[39]) {
this.rotation += this.rotationSpeed * ctx.ndt;
}
if (ctx.keys[83] || ctx.keys[40]) {
this.vx *= 0.95;
this.vy *= 0.95;
}
if (ctx.keys[65] || ctx.keys[37]) {
this.rotation -= this.rotationSpeed;
}
ax = cos(this.rotation) * this.thrust;
ay = sin(this.rotation) * this.thrust;
this.vx += ax;
this.vy += ay;
this.vx *= 0.99;
this.vy *= 0.99;
this.x += this.vx * ctx.ndt;
this.y += this.vy * ctx.ndt;
this.tlx = this.x + (this.width / 2) - cos(-atan2(this.halfHeight, this.halfWidth) - this.rotation) * this.diagLength;
this.tly = this.y + (this.height / 2) + sin(-atan2(this.halfHeight, this.halfWidth) - this.rotation) * this.diagLength;
this.trx = this.x + (this.width / 2) - cos(-atan2(this.halfHeight, this.halfWidth) + this.rotation) * -this.diagLength;
this["try"] = this.y + (this.height / 2) - sin(-atan2(this.halfHeight, this.halfWidth) + this.rotation) * -this.diagLength;
this.brx = this.x + (this.width / 2) + cos(-atan2(this.halfHeight, this.halfWidth) - this.rotation) * this.diagLength;
this.bry = this.y + (this.height / 2) - sin(-atan2(this.halfHeight, this.halfWidth) - this.rotation) * this.diagLength;
this.blx = this.x + (this.width / 2) + cos(-atan2(this.halfHeight, this.halfWidth) + this.rotation) * -this.diagLength;
this.bly = this.y + (this.height / 2) + sin(-atan2(this.halfHeight, this.halfWidth) + this.rotation) * -this.diagLength;
this.xMin = min(this.tlx, this.trx, this.brx, this.blx);
this.xMax = max(this.tlx, this.trx, this.brx, this.blx);
this.yMin = min(this.tly, this["try"], this.bry, this.bly);
this.yMax = max(this.tly, this["try"], this.bry, this.bly);
this.bWidth = this.xMax - this.xMin;
this.bHeight = this.yMax - this.yMin;
if (this.xMin > ctx.width + this.maxLength) {
this.x = -this.maxLength;
} else if (this.xMax < -this.maxLength) {
this.x = ctx.width;
}
if (this.yMin > ctx.height + this.maxLength) {
return this.y = -this.maxLength;
} else if (this.yMax < -this.maxLength) {
return this.y = ctx.height;
}
};
Ship.prototype.draw = function(ctx) {
ctx.save();
ctx.translate(this.x + this.width / 2, this.y + this.height / 2);
ctx.rotate(this.rotation);
ctx.drawImage(shipImg, -this.width / 2, -this.height / 2);
if (this.thrust) {
ctx.beginPath();
ctx.arc(-this.width / 2 - 10, 0, random(1, 10), 0, TWO_PI);
ctx.fillStyle = 'hsla(' + random(0, 60) + ', 100%, ' + random(60, 80) + '%, 1)';
ctx.fill();
}
ctx.restore();
if (this.flashFlag) {
this.flashFlag = false;
ctx.save();
ctx.globalCompositeOperation = 'source-in';
ctx.fillStyle = 'hsla(' + ctx.hue + ', 100%, 75%, 0.95)';
ctx.fillRect(this.xMin, this.yMin, this.bWidth, this.bHeight);
return ctx.restore();
}
};
Ship.prototype.drawCorners = function(ctx) {
ctx.beginPath();
ctx.arc(this.tlx, this.tly, 1, 0, TWO_PI);
ctx.arc(this.trx, this["try"], 1, 0, TWO_PI);
ctx.arc(this.brx, this.bry, 1, 0, TWO_PI);
ctx.arc(this.blx, this.bly, 1, 0, TWO_PI);
ctx.fillStyle = 'hsla(0, 0%, 100%, .75)';
return ctx.fill();
};
Ship.prototype.drawBoundingBox = function(ctx) {
ctx.fillStyle = 'hsla(0, 0%, 100%, .1)';
return ctx.fillRect(this.xMin, this.yMin, this.bWidth, this.bHeight);
};
return Ship;
})();
Coin = (function() {
function Coin(x, y, value) {
this.x = x;
this.y = y;
this.vx = random(-50, 100) / 100;
this.vy = random(-50, 100) / 100;
this.radius = 4;
this.value = value;
this.magnetized = false;
this.xScale = 1;
this.xScaleGrow = true;
this.collected = false;
this.alpha = 0;
this.cv = 0;
}
Coin.prototype.update = function(ctx, i) {
var angle, dist, dx, dy, mvx, mvy, power, scaleChange;
if (this.alpha < 1 && !this.collected) {
this.alpha += 0.05 * ctx.ndt;
}
if (this.xScaleGrow && this.xScale >= 1) {
this.xScaleGrow = false;
} else if (!this.xScaleGrow && this.xScale <= 0.1) {
this.xScaleGrow = true;
}
scaleChange = this.magnetized ? 0.15 : 0.05;
if (this.xScaleGrow) {
this.xScale += scaleChange;
} else {
this.xScale -= scaleChange;
}
if (!this.collected) {
dx = ctx.ship.x + ctx.ship.width / 2 - this.x;
dy = ctx.ship.y + ctx.ship.height / 2 - this.y;
dist = sqrt(dx * dx + dy * dy);
if (dist <= ctx.magnetRange) {
this.magnetized = true;
angle = atan2(dy, dx);
mvx = cos(angle);
mvy = sin(angle);
power = 3 + (100 / dist);
this.x += (mvx * power) * ctx.ndt;
this.y += (mvy * power) * ctx.ndt;
} else {
this.magnetized = false;
this.x += this.vx * ctx.ndt;
this.y += this.vy * ctx.ndt;
}
if (dist <= 15) {
ctx.ship.flashFlag = true;
ctx.profit += this.value;
this.collected = true;
this.magnetized = false;
}
} else {
this.alpha -= 0.03 * ctx.ndt;
this.cv += 0.15 * ctx.ndt;
this.y -= this.cv * ctx.ndt;
}
if (this.outOfBounds(ctx)) {
return ctx.coins.splice(i, 1);
}
};
Coin.prototype.outOfBounds = function(ctx) {
return this.x > ctx.width + this.radius || this.x < -this.radius || this.y > ctx.height + this.radius || this.y < -this.radius;
};
Coin.prototype.draw = function(ctx, i) {
if (!this.collected) {
ctx.save();
ctx.translate(this.x, this.y);
ctx.scale(this.xScale, 1);
ctx.beginPath();
ctx.arc(0, 0, (this.radius < 0 ? 0 : this.radius), 0, TWO_PI, false);
if (this.magnetized) {
ctx.fillStyle = 'hsla(0, 0%, ' + (this.xScale * 140) + '%, ' + this.alpha + ')';
} else {
ctx.fillStyle = 'hsla(' + ctx.hue + ', 100%, ' + (this.xScale * 70) + '%, ' + this.alpha + ')';
}
ctx.fill();
return ctx.restore();
} else {
ctx.fillStyle = 'hsla(0, 0%, 0%, ' + (this.alpha < 0 ? 0 : this.alpha) + ')';
ctx.fillText('+' + this.value, this.x, this.y + 1);
ctx.fillStyle = 'hsla(' + ctx.hue + ', 100%, 60%, ' + (this.alpha < 0 ? 0 : this.alpha) + ')';
return ctx.fillText('+' + this.value, this.x, this.y);
}
};
return Coin;
})();
shipImg.onload = function() {
return Sketch.create({
setup: function() {
var self;
this.profit = 0;
this.profitDisplayVal = 0;
this.profitDisplay = $('.profit span');
this.magnetRange = 250;
this.hue = 60;
this.ndt = 1;
this.coins = [];
this.numberWithCommas = function(x) {
x = Math.round(x);
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
this.ship = new Ship(this);
this.font = 'bold 14px arial';
this.textAlign = 'center';
self = this;
this.boundingBoxCheck = $('.bounding-box');
this.showBoundingBox = false;
this.boundingBoxCheck.on('change', function() {
return self.showBoundingBox = $(this).is(':checked');
});
return setInterval(function() {
return self.coins.push(new Coin(random(0, self.width), random(0, self.height), floor(random(1, 100))));
}, 150);
},
clear: function() {
return this.clearRect(0, 0, this.width, this.height);
},
update: function() {
var i;
this.ndt = this.dt / 16;
this.hue += 0.75;
this.ship.update(this);
i = this.coins.length;
while (i--) {
this.coins[i].update(this, i);
}
return this.profitDisplayVal += (this.profit - this.profitDisplayVal) * 0.1;
},
draw: function() {
var i;
if (this.showBoundingBox) {
this.ship.drawBoundingBox(this);
this.ship.drawCorners(this);
}
this.ship.draw(this);
i = this.coins.length;
while (i--) {
this.coins[i].draw(this, i);
}
return this.profitDisplay.text(this.numberWithCommas(this.profitDisplayVal));
}
});
};
}).call(this);
</script>
</body>
css部分:
body {
font-size: 100%; padding: 0; margin: 0;
background: #090909 url(img/space-tile.png);
color: #ccc;
font: 100%/1.5 sans-serif;
text-shadow: 0 1px 0 #000;
}
canvas {
display: block;
}
.panel {
background: hsla(0, 0%, 0%, 0.5);
font-size: 12px;
left: 0;
padding: 15px 20px;
position: absolute;
top: 0;
}
.profit {
color: #fff;
font-family: Michroma, sans-serif;
font-size: 18px;
margin: 0 0 5px;
}
.profit span {
margin: 0 0 0 2px;
}
input {
margin: 0 0 0 3px;
vertical-align: middle;}
js部分:
sketch.min.js:
! function(e, t) {
"object" == typeof exports ? module.exports = t(e, e.document) : "function" == typeof define && define.amd ? define(function() {
return t(e, e.document)
}) : e.Sketch = t(e, e.document)
}(typeof window !== "undefined" ? window : this, function(e, t) {
"use strict";
function n(e) {
return "[object Array]" == Object.prototype.toString.call(e)
}
function o(e) {
return "function" == typeof e
}
function r(e) {
return "number" == typeof e
}
function i(e) {
return "string" == typeof e
}
function u(e) {
return C[e] || String.fromCharCode(e)
}
function a(e, t, n) {
for(var o in t) !n && o in e || (e[o] = t[o]);
return e
}
function c(e, t) {
return function() {
e.apply(t, arguments)
}
}
function s(e) {
var t = {};
for(var n in e) t[n] = o(e[n]) ? c(e[n], e) : e[n];
return t
}
function l(e) {
function t(t) {
o(t) && t.apply(e, [].splice.call(arguments, 1))
}
function n(e) {
for(_ = 0; _ < et.length; _++) B = et[_], i(B) ? O[(e ? "add" : "remove") + "EventListener"].call(O, B, k, !1) : o(B) ? k = B : O = B
}
function r() {
R(T), T = L(r), K || (t(e.setup), K = o(e.setup)), U || (t(e.resize), U = o(e.resize)), e.running && !Y && (e.dt = (z = +new Date) - e.now, e.millis += e.dt, e.now = z, t(e.update), Z && (e.retina && (e.save(), e.scale(V, V)), e.autoclear && e.clear()), t(e.draw), Z && e.retina && e.restore()), Y = ++Y % e.interval
}
function c() {
O = J ? e.style : e.canvas, D = J ? "px" : "", Q = e.width, X = e.height, e.fullscreen && (X = e.height = w.innerHeight, Q = e.width = w.innerWidth), e.retina && Z && V && (O.style.height = X + "px", O.style.width = Q + "px", Q *= V, X *= V), O.height !== X && (O.height = X + D), O.width !== Q && (O.width = Q + D), K && t(e.resize)
}
function l(e, t) {
return N = t.getBoundingClientRect(), e.x = e.pageX - N.left - (w.scrollX || w.pageXOffset), e.y = e.pageY - N.top - (w.scrollY || w.pageYOffset), e
}
function f(t, n) {
return l(t, e.element), n = n || {}, n.ox = n.x || t.x, n.oy = n.y || t.y, n.x = t.x, n.y = t.y, n.dx = n.x - n.ox, n.dy = n.y - n.oy, n
}
function d(e) {
if(e.preventDefault(), G = s(e), G.originalEvent = e, G.touches)
for(M.length = G.touches.length, _ = 0; _ < G.touches.length; _++) M[_] = f(G.touches[_], M[_]);
else M.length = 0, M[0] = f(G, $);
return a($, M[0], !0), G
}
function g(n) {
for(n = d(n), j = (q = et.indexOf(W = n.type)) - 1, e.dragging = /down|start/.test(W) ? !0 : /up|end/.test(W) ? !1 : e.dragging; j;) i(et[j]) ? t(e[et[j--]], n) : i(et[q]) ? t(e[et[q++]], n) : j = 0
}
function p(n) {
F = n.keyCode, H = "keyup" == n.type, tt[F] = tt[u(F)] = !H, t(e[n.type], n)
}
function m(n) {
e.autopause && ("blur" == n.type ? b : y)(), t(e[n.type], n)
}
function y() {
e.now = +new Date, e.running = !0
}
function b() {
e.running = !1
}
function P() {
(e.running ? b : y)()
}
function A() {
Z && e.clearRect(0, 0, e.width, e.height)
}
function S() {
I = e.element.parentNode, _ = E.indexOf(e), I && I.removeChild(e.element), ~_ && E.splice(_, 1), n(!1), b()
}
var T, k, O, I, N, _, D, z, B, G, W, F, H, j, q, Q, X, Y = 0,
M = [],
U = !1,
K = !1,
V = w.devicePixelRatio || 1,
J = e.type == x,
Z = e.type == h,
$ = {
x: 0,
y: 0,
ox: 0,
oy: 0,
dx: 0,
dy: 0
},
et = [e.element, g, "mousedown", "touchstart", g, "mousemove", "touchmove", g, "mouseup", "touchend", g, "click", g, "mouseout", g, "mouseover", v, p, "keydown", "keyup", w, m, "focus", "blur", c, "resize"],
tt = {};
for(F in C) tt[C[F]] = !1;
return a(e, {
touches: M,
mouse: $,
keys: tt,
dragging: !1,
running: !1,
millis: 0,
now: 0 / 0,
dt: 0 / 0,
destroy: S,
toggle: P,
clear: A,
start: y,
stop: b
}), E.push(e), e.autostart && y(), n(!0), c(), r(), e
}
for(var f, d, g = "E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min".split(" "), p = "__hasSketch", m = Math, h = "canvas", y = "webgl", x = "dom", v = t, w = e, E = [], b = {
fullscreen: !0,
autostart: !0,
autoclear: !0,
autopause: !0,
container: v.body,
interval: 1,
globals: !0,
retina: !1,
type: h
}, C = {
8: "BACKSPACE",
9: "TAB",
13: "ENTER",
16: "SHIFT",
27: "ESCAPE",
32: "SPACE",
37: "LEFT",
38: "UP",
39: "RIGHT",
40: "DOWN"
}, P = {
CANVAS: h,
WEB_GL: y,
WEBGL: y,
DOM: x,
instances: E,
install: function(e) {
if(!e[p]) {
for(var t = 0; t < g.length; t++) e[g[t]] = m[g[t]];
a(e, {
TWO_PI: 2 * m.PI,
HALF_PI: m.PI / 2,
QUATER_PI: m.PI / 4,
random: function(e, t) {
return n(e) ? e[~~(m.random() * e.length)] : (r(t) || (t = e || 1, e = 0), e + m.random() * (t - e))
},
lerp: function(e, t, n) {
return e + n * (t - e)
},
map: function(e, t, n, o, r) {
return(e - t) / (n - t) * (r - o) + o
}
}), e[p] = !0
}
},
create: function(e) {
return e = a(e || {}, b), e.globals && P.install(self), f = e.element = e.element || v.createElement(e.type === x ? "div" : "canvas"), d = e.context = e.context || function() {
switch(e.type) {
case h:
return f.getContext("2d", e);
case y:
return f.getContext("webgl", e) || f.getContext("experimental-webgl", e);
case x:
return f.canvas = f
}
}(), (e.container || v.body).appendChild(f), P.augment(d, e)
},
augment: function(e, t) {
return t = a(t || {}, b), t.element = e.canvas || e, t.element.className += " sketch", a(e, t, !0), l(e)
}
}, A = ["ms", "moz", "webkit", "o"], S = self, T = 0, k = "AnimationFrame", O = "request" + k, I = "cancel" + k, L = S[O], R = S[I], N = 0; N < A.length && !L; N++) L = S[A[N] + "Request" + k], R = S[A[N] + "Cancel" + k];
return S[O] = L = L || function(e) {
var t = +new Date,
n = m.max(0, 16 - (t - T)),
o = setTimeout(function() {
e(t + n)
}, n);
return T = t + n, o
}, S[I] = R = R || function(e) {
clearTimeout(e)
}, P
});
jquery.min.js:
! function(a, b) {
"object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) {
if(!a.document) throw new Error("jQuery requires a window with a document");
return b(a)
} : b(a)
}("undefined" != typeof window ? window : this, function(a, b) {
var c = [],
d = c.slice,
e = c.concat,
f = c.push,
g = c.indexOf,
h = {},
i = h.toString,
j = h.hasOwnProperty,
k = "".trim,
l = {},
m = "1.11.0",
n = function(a, b) {
return new n.fn.init(a, b)
},
o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
p = /^-ms-/,
q = /-([\da-z])/gi,
r = function(a, b) {
return b.toUpperCase()
};
n.fn = n.prototype = {
jquery: m,
constructor: n,
selector: "",
length: 0,
toArray: function() {
return d.call(this)
},
get: function(a) {
return null != a ? 0 > a ? this[a + this.length] : this[a] : d.call(this)
},
pushStack: function(a) {
var b = n.merge(this.constructor(), a);
return b.prevObject = this, b.context = this.context, b
},
each: function(a, b) {
return n.each(this, a, b)
},
map: function(a) {
return this.pushStack(n.map(this, function(b, c) {
return a.call(b, c, b)
}))
},
slice: function() {
return this.pushStack(d.apply(this, arguments))
},
first: function() {
return this.eq(0)
},
last: function() {
return this.eq(-1)
},
eq: function(a) {
var b = this.length,
c = +a + (0 > a ? b : 0);
return this.pushStack(c >= 0 && b > c ? [this[c]] : [])
},
end: function() {
return this.prevObject || this.constructor(null)
},
push: f,
sort: c.sort,
splice: c.splice
}, n.extend = n.fn.extend = function() {
var a, b, c, d, e, f, g = arguments[0] || {},
h = 1,
i = arguments.length,
j = !1;
for("boolean" == typeof g && (j = g, g = arguments[h] || {}, h++), "object" == typeof g || n.isFunction(g) || (g = {}), h === i && (g = this, h--); i > h; h++)
if(null != (e = arguments[h]))
for(d in e) a = g[d], c = e[d], g !== c && (j && c && (n.isPlainObject(c) || (b = n.isArray(c))) ? (b ? (b = !1, f = a && n.isArray(a) ? a : []) : f = a && n.isPlainObject(a) ? a : {}, g[d] = n.extend(j, f, c)) : void 0 !== c && (g[d] = c));
return g
}, n.extend({
expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""),
isReady: !0,
error: function(a) {
throw new Error(a)
},
noop: function() {
},
isFunction: function(a) {
return "function" === n.type(a)
},
isArray: Array.isArray || function(a) {
return "array" === n.type(a)
},
isWindow: function(a) {
return null != a && a == a.window
},
isNumeric: function(a) {
return a - parseFloat(a) >= 0
},
isEmptyObject: function(a) {
var b;
for(b in a) return !1;
return !0
},
isPlainObject: function(a) {
var b;
if(!a || "object" !== n.type(a) || a.nodeType || n.isWindow(a)) return !1;
try {
if(a.constructor && !j.call(a, "constructor") && !j.call(a.constructor.prototype, "isPrototypeOf")) return !1
} catch(c) {
return !1
}
if(l.ownLast)
for(b in a) return j.call(a, b);
for(b in a);
return void 0 === b || j.call(a, b)
},
type: function(a) {
return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h[i.call(a)] || "object" : typeof a
},
globalEval: function(b) {
b && n.trim(b) && (a.execScript || function(b) {
a.eval.call(a, b)
})(b)
},
camelCase: function(a) {
return a.replace(p, "ms-").replace(q, r)
},
nodeName: function(a, b) {
return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase()
},
each: function(a, b, c) {
var d, e = 0,
f = a.length,
g = s(a);
if(c) {
if(g) {
for(; f > e; e++)
if(d = b.apply(a[e], c), d === !1) break
} else
for(e in a)
if(d = b.apply(a[e], c), d === !1) break
} else if(g) {
for(; f > e; e++)
if(d = b.call(a[e], e, a[e]), d === !1) break
} else
for(e in a)
if(d = b.call(a[e], e, a[e]), d === !1) break; return a
},
trim: k && !k.call("\ufeff\xa0") ? function(a) {
return null == a ? "" : k.call(a)
} : function(a) {
return null == a ? "" : (a + "").replace(o, "")
},
makeArray: function(a, b) {
var c = b || [];
return null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : f.call(c, a)), c
},
inArray: function(a, b, c) {
var d;
if(b) {
if(g) return g.call(b, a, c);
for(d = b.length, c = c ? 0 > c ? Math.max(0, d + c) : c : 0; d > c; c++)
if(c in b && b[c] === a) return c
}
return -1
},
merge: function(a, b) {
var c = +b.length,
d = 0,
e = a.length;
while(c > d) a[e++] = b[d++];
if(c !== c)
while(void 0 !== b[d]) a[e++] = b[d++];
return a.length = e, a
},
grep: function(a, b, c) {
for(var d, e = [], f = 0, g = a.length, h = !c; g > f; f++) d = !b(a[f], f), d !== h && e.push(a[f]);
return e
},
map: function(a, b, c) {
var d, f = 0,
g = a.length,
h = s(a),
i = [];
if(h)
for(; g > f; f++) d = b(a[f], f, c), null != d && i.push(d);
else
for(f in a) d = b(a[f], f, c), null != d && i.push(d);
return e.apply([], i)
},
guid: 1,
proxy: function(a, b) {
var c, e, f;
return "string" == typeof b && (f = a[b], b = a, a = f), n.isFunction(a) ? (c = d.call(arguments, 2), e = function() {
return a.apply(b || this, c.concat(d.call(arguments)))
}, e.guid = a.guid = a.guid || n.guid++, e) : void 0
},
now: function() {
return +new Date
},
support: l
}), n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(a, b) {
h["[object " + b + "]"] = b.toLowerCase()
});
function s(a) {
var b = a.length,
c = n.type(a);
return "function" === c || n.isWindow(a) ? !1 : 1 === a.nodeType && b ? !0 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a
}
var t = function(a) {
var b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s = "sizzle" + -new Date,
t = a.document,
u = 0,
v = 0,
w = eb(),
x = eb(),
y = eb(),
z = function(a, b) {
return a === b && (j = !0), 0
},
A = "undefined",
B = 1 << 31,
C = {}.hasOwnProperty,
D = [],
E = D.pop,
F = D.push,
G = D.push,
H = D.slice,
I = D.indexOf || function(a) {
for(var b = 0, c = this.length; c > b; b++)
if(this[b] === a) return b;
return -1
},
J = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
K = "[\\x20\\t\\r\\n\\f]",
L = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
M = L.replace("w", "w#"),
N = "\\[" + K + "*(" + L + ")" + K + "*(?:([*^$|!~]?=)" + K + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + M + ")|)|)" + K + "*\\]",
O = ":(" + L + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + N.replace(3, 8) + ")*)|.*)\\)|)",
P = new RegExp("^" + K + "+|((?:^|[^\\\\])(?:\\\\.)*)" + K + "+$", "g"),
Q = new RegExp("^" + K + "*," + K + "*"),
R = new RegExp("^" + K + "*([>+~]|" + K + ")" + K + "*"),
S = new RegExp("=" + K + "*([^\\]'\"]*?)" + K + "*\\]", "g"),
T = new RegExp(O),
U = new RegExp("^" + M + "$"),
V = {
ID: new RegExp("^#(" + L + ")"),
CLASS: new RegExp("^\\.(" + L + ")"),
TAG: new RegExp("^(" + L.replace("w", "w*") + ")"),
ATTR: new RegExp("^" + N),
PSEUDO: new RegExp("^" + O),
CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + K + "*(even|odd|(([+-]|)(\\d*)n|)" + K + "*(?:([+-]|)" + K + "*(\\d+)|))" + K + "*\\)|)", "i"),
bool: new RegExp("^(?:" + J + ")$", "i"),
needsContext: new RegExp("^" + K + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + K + "*((?:-\\d)?\\d*)" + K + "*\\)|)(?=[^-]|$)", "i")
},
W = /^(?:input|select|textarea|button)$/i,
X = /^h\d$/i,
Y = /^[^{]+\{\s*\[native \w/,
Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
$ = /[+~]/,
_ = /'|\\/g,
ab = new RegExp("\\\\([\\da-f]{1,6}" + K + "?|(" + K + ")|.)", "ig"),
bb = function(a, b, c) {
var d = "0x" + b - 65536;
return d !== d || c ? b : 0 > d ? String.fromCharCode(d + 65536) : String.fromCharCode(d >> 10 | 55296, 1023 & d | 56320)
};
try {
G.apply(D = H.call(t.childNodes), t.childNodes), D[t.childNodes.length].nodeType
} catch(cb) {
G = {
apply: D.length ? function(a, b) {
F.apply(a, H.call(b))
} : function(a, b) {
var c = a.length,
d = 0;
while(a[c++] = b[d++]);
a.length = c - 1
}
}
}
function db(a, b, d, e) {
var f, g, h, i, j, m, p, q, u, v;
if((b ? b.ownerDocument || b : t) !== l && k(b), b = b || l, d = d || [], !a || "string" != typeof a) return d;
if(1 !== (i = b.nodeType) && 9 !== i) return [];
if(n && !e) {
if(f = Z.exec(a))
if(h = f[1]) {
if(9 === i) {
if(g = b.getElementById(h), !g || !g.parentNode) return d;
if(g.id === h) return d.push(g), d
} else if(b.ownerDocument && (g = b.ownerDocument.getElementById(h)) && r(b, g) && g.id === h) return d.push(g), d
} else {
if(f[2]) return G.apply(d, b.getElementsByTagName(a)), d;
if((h = f[3]) && c.getElementsByClassName && b.getElementsByClassName) return G.apply(d, b.getElementsByClassName(h)), d
}
if(c.qsa && (!o || !o.test(a))) {
if(q = p = s, u = b, v = 9 === i && a, 1 === i && "object" !== b.nodeName.toLowerCase()) {
m = ob(a), (p = b.getAttribute("id")) ? q = p.replace(_, "\\$&") : b.setAttribute("id", q), q = "[id='" + q + "'] ", j = m.length;
while(j--) m[j] = q + pb(m[j]);
u = $.test(a) && mb(b.parentNode) ||