Created
March 1, 2015 00:21
-
-
Save mkorostoff/a017c51580f277efd39b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| window.Modernizr = function(a, d, f) { | |
| var g = {}, | |
| c = d.documentElement; | |
| a = d.createElement("modernizr"); | |
| a = a.style; | |
| var h = {}.toString, | |
| k = {}, | |
| l = [], | |
| n = l.slice, | |
| p, r = {}.hasOwnProperty, | |
| q; | |
| "undefined" !== typeof r && "undefined" !== typeof r.call ? q = function(a, c) { | |
| return r.call(a, c) | |
| } : q = function(a, c) { | |
| return c in a && "undefined" === typeof a.constructor.prototype[c] | |
| }; | |
| Function.prototype.bind || (Function.prototype.bind = function(a) { | |
| var c = this; | |
| if ("function" != typeof c) throw new TypeError; | |
| var g = n.call(arguments, 1), | |
| f = function() { | |
| if (this instanceof f) { | |
| var d = function() {}; | |
| d.prototype = c.prototype; | |
| var d = new d, | |
| h = c.apply(d, g.concat(n.call(arguments))); | |
| return Object(h) === h ? h : d | |
| } | |
| return c.apply(a, g.concat(n.call(arguments))) | |
| }; | |
| return f | |
| }); | |
| k.smil = function() { | |
| return !!d.createElementNS && /SVGAnimate/.test(h.call(d.createElementNS("http://www.w3.org/2000/svg", "animate"))) | |
| }; | |
| for (var s in k) q(k, s) && (p = s.toLowerCase(), g[p] = k[s](), l.push((g[p] ? "" : "no-") + p)); | |
| g.addTest = function(a, d) { | |
| if ("object" == typeof a) | |
| for (var h in a) q(a, h) && g.addTest(h, a[h]); | |
| else { | |
| a = a.toLowerCase(); | |
| if (g[a] !== f) return g; | |
| d = "function" == typeof d ? d() : d; | |
| "undefined" != typeof enableClasses && enableClasses && (c.className += " " + (d ? "" : "no-") + a); | |
| g[a] = d | |
| } | |
| return g | |
| }; | |
| a.cssText = ""; | |
| return a = null, g._version = "2.8.3", g | |
| }(this, this.document); | |
| (function(a, d, f) { | |
| function g(a) { | |
| return "[object Function]" == t.call(a) | |
| } | |
| function c(a) { | |
| return "string" == typeof a | |
| } | |
| function h() {} | |
| function k(a) { | |
| return !a || "loaded" == a || "complete" == a || "uninitialized" == a | |
| } | |
| function l() { | |
| var a = u.shift(); | |
| v = 1; | |
| a ? a.t ? s(function() { | |
| ("c" == a.t ? H.injectCss : H.injectJs)(a.s, 0, a.a, a.x, a.e, 1) | |
| }, 0) : (a(), l()) : v = 0 | |
| } | |
| function n(a, c, g, f, h, p, n) { | |
| function r(g) { | |
| if (!t && k(q.readyState) && (G.r = t = 1, !v && l(), q.onload = q.onreadystatechange = null, g)) { | |
| "img" != a && s(function() { | |
| D.removeChild(q) | |
| }, 50); | |
| for (var d in E[c]) E[c].hasOwnProperty(d) && | |
| E[c][d].onload() | |
| } | |
| } | |
| n = n || H.errorTimeout; | |
| var q = d.createElement(a), | |
| t = 0, | |
| z = 0, | |
| G = { | |
| t: g, | |
| s: c, | |
| e: h, | |
| a: p, | |
| x: n | |
| }; | |
| 1 === E[c] && (z = 1, E[c] = []); | |
| "object" == a ? q.data = c : (q.src = c, q.type = a); | |
| q.width = q.height = "0"; | |
| q.onerror = q.onload = q.onreadystatechange = function() { | |
| r.call(this, z) | |
| }; | |
| u.splice(f, 0, G); | |
| "img" != a && (z || 2 === E[c] ? (D.insertBefore(q, C ? null : w), s(r, n)) : E[c].push(q)) | |
| } | |
| function p(a, g, d, f, h) { | |
| return v = 0, g = g || "j", c(a) ? n("c" == g ? B : F, a, g, this.i++, d, f, h) : (u.splice(this.i++, 0, a), 1 == u.length && l()), this | |
| } | |
| function r() { | |
| var a = H; | |
| return a.loader = { | |
| load: p, | |
| i: 0 | |
| }, a | |
| } | |
| var q = d.documentElement, | |
| s = a.setTimeout, | |
| w = d.getElementsByTagName("script")[0], | |
| t = {}.toString, | |
| u = [], | |
| v = 0, | |
| z = "MozAppearance" in q.style, | |
| C = z && !!d.createRange().compareNode, | |
| D = C ? q : w.parentNode, | |
| q = a.opera && "[object Opera]" == t.call(a.opera), | |
| q = !!d.attachEvent && !q, | |
| F = z ? "object" : q ? "script" : "img", | |
| B = q ? "script" : F, | |
| G = Array.isArray || function(a) { | |
| return "[object Array]" == t.call(a) | |
| }, | |
| J = [], | |
| E = {}, | |
| M = { | |
| timeout: function(a, c) { | |
| return c.length && (a.timeout = c[0]), a | |
| } | |
| }, | |
| N, H; | |
| H = function(a) { | |
| function d(a) { | |
| a = a.split("!"); | |
| var c = J.length, | |
| g = | |
| a.pop(), | |
| f = a.length, | |
| g = { | |
| url: g, | |
| origUrl: g, | |
| prefixes: a | |
| }, | |
| h, k, n; | |
| for (k = 0; k < f; k++) n = a[k].split("="), (h = M[n.shift()]) && (g = h(g, n)); | |
| for (k = 0; k < c; k++) g = J[k](g); | |
| return g | |
| } | |
| function k(a, c, h, n, p) { | |
| var l = d(a), | |
| q = l.autoCallback; | |
| l.url.split(".").pop().split("?").shift(); | |
| l.bypass || (c && (c = g(c) ? c : c[a] || c[n] || c[a.split("/").pop().split("?")[0]]), l.instead ? l.instead(a, c, h, n, p) : (E[l.url] ? l.noexec = !0 : E[l.url] = 1, h.load(l.url, l.forceCSS || !l.forceJS && "css" == l.url.split(".").pop().split("?").shift() ? "c" : f, l.noexec, l.attrs, l.timeout), (g(c) || g(q)) && h.load(function() { | |
| r(); | |
| c && c(l.origUrl, p, n); | |
| q && q(l.origUrl, p, n); | |
| E[l.url] = 2 | |
| }))) | |
| } | |
| function n(a, d) { | |
| function f(a, h) { | |
| if (a) | |
| if (c(a)) h || (r = function() { | |
| var a = [].slice.call(arguments); | |
| q.apply(this, a); | |
| s() | |
| }), k(a, r, d, 0, p); | |
| else { | |
| if (Object(a) === a) | |
| for (z in t = function() { | |
| var c = 0, | |
| g; | |
| for (g in a) a.hasOwnProperty(g) && c++; | |
| return c | |
| }(), a) a.hasOwnProperty(z) && (!h && !--t && (g(r) ? r = function() { | |
| var a = [].slice.call(arguments); | |
| q.apply(this, a); | |
| s() | |
| } : r[z] = function(a) { | |
| return function() { | |
| var c = [].slice.call(arguments); | |
| a && a.apply(this, | |
| c); | |
| s() | |
| } | |
| }(q[z])), k(a[z], r, d, z, p)) | |
| } else !h && s() | |
| } | |
| var p = !!a.test, | |
| l = a.load || a.both, | |
| r = a.callback || h, | |
| q = r, | |
| s = a.complete || h, | |
| t, z; | |
| f(p ? a.yep : a.nope, !!l); | |
| l && f(l) | |
| } | |
| var p, l, q = this.yepnope.loader; | |
| if (c(a)) k(a, 0, q, 0); | |
| else if (G(a)) | |
| for (p = 0; p < a.length; p++) l = a[p], c(l) ? k(l, 0, q, 0) : G(l) ? H(l) : Object(l) === l && n(l, q); | |
| else Object(a) === a && n(a, q) | |
| }; | |
| H.addPrefix = function(a, c) { | |
| M[a] = c | |
| }; | |
| H.addFilter = function(a) { | |
| J.push(a) | |
| }; | |
| H.errorTimeout = 1E4; | |
| null == d.readyState && d.addEventListener && (d.readyState = "loading", d.addEventListener("DOMContentLoaded", | |
| N = function() { | |
| d.removeEventListener("DOMContentLoaded", N, 0); | |
| d.readyState = "complete" | |
| }, 0)); | |
| a.yepnope = r(); | |
| a.yepnope.executeStack = l; | |
| a.yepnope.injectJs = function(a, c, g, f, n, p) { | |
| var r = d.createElement("script"), | |
| q, t; | |
| f = f || H.errorTimeout; | |
| r.src = a; | |
| for (t in g) r.setAttribute(t, g[t]); | |
| c = p ? l : c || h; | |
| r.onreadystatechange = r.onload = function() { | |
| !q && k(r.readyState) && (q = 1, c(), r.onload = r.onreadystatechange = null) | |
| }; | |
| s(function() { | |
| q || (q = 1, c(1)) | |
| }, f); | |
| n ? r.onload() : w.parentNode.insertBefore(r, w) | |
| }; | |
| a.yepnope.injectCss = function(a, c, g, f, k, n) { | |
| f = | |
| d.createElement("link"); | |
| var p; | |
| c = n ? l : c || h; | |
| f.href = a; | |
| f.rel = "stylesheet"; | |
| f.type = "text/css"; | |
| for (p in g) f.setAttribute(p, g[p]); | |
| k || (w.parentNode.insertBefore(f, w), s(c, 0)) | |
| } | |
| })(this, document); | |
| Modernizr.load = function() { | |
| yepnope.apply(window, [].slice.call(arguments, 0)) | |
| }; | |
| Modernizr.load([{ | |
| test: Modernizr.smil, | |
| nope: [STATIC_URL + "css/pages/fallback.css"] | |
| }]); | |
| function Ajax(a) { | |
| var d = this; | |
| d.request = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP"); | |
| d.convertHeadersToObject = function(a) { | |
| a = a.split("\n"); | |
| for (var c = {}, f = 0; f < a.length; f++) { | |
| var d = a[f].split(": ", 2); | |
| 1 < d.length && (c[d[0]] = d[1]) | |
| } | |
| return c | |
| }; | |
| d.request.onreadystatechange = function() { | |
| if (4 == d.request.readyState && 200 == d.request.status) { | |
| var g = d.request.getResponseHeader("Content-Type"); | |
| g.match(/xml/gi) ? g = d.request.responseXML : g.match(/json/gi) ? (eval("var qqq=" + d.request.responseText), | |
| g = qqq) : g = d.request.responseText; | |
| if (a.onComplete) | |
| if (d.includeHeaders) { | |
| var c = d.convertHeadersToObject(d.request.getAllResponseHeaders()); | |
| a.onComplete(g, c) | |
| } else a.onComplete(g) | |
| } else if (4 == d.request.readyState && 200 != d.request.status && a.onFailure) a.onFailure({ | |
| text: d.request.responseText, | |
| code: d.request.status | |
| }) | |
| }; | |
| var f = ""; | |
| if (a.params) | |
| if (a.params.substr) f = a.params; | |
| else { | |
| for (param in a.params) f += "&" + encodeURIComponent(param) + "=" + encodeURIComponent(a.params[param]); | |
| f = f.substr(1) | |
| } | |
| d.includeHeaders = a.includeHeaders; | |
| if ("GET" == a.method) { | |
| f && (f = "?" + f); | |
| d.request.open("GET", a.path + f, !0); | |
| for (header in a.headers) d.request.setRequestHeader(header, a.headers[header]); | |
| d.request.setRequestHeader("X-Requested-With", "XMLHttpRequest"); | |
| d.request.send(null) | |
| } else { | |
| d.request.open("POST", a.path, !0); | |
| for (header in a.headers) d.request.setRequestHeader(header, a.headers[header]); | |
| d.request.setRequestHeader("X-Requested-With", "XMLHttpRequest"); | |
| d.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); | |
| d.request.send(f) | |
| } | |
| d.abort = | |
| function() { | |
| d.request.onreadystatechange = null; | |
| d.request.abort(); | |
| if (a.onFailure) a.onFailure({ | |
| text: d.request.responseText, | |
| code: d.request.status | |
| }) | |
| } | |
| }; | |
| var Tween = function(a, d, f) { | |
| this.ease = function(a, g, f, d) { | |
| return f * a / d + g | |
| }; | |
| this.onComplete = function() {}; | |
| this.onUpdate = function() {}; | |
| this.running = null; | |
| this.prefix = this.units = ""; | |
| this.delay = 0; | |
| this.begin = {}; | |
| var g = this; | |
| this.__construct__ = function() { | |
| this.time = d; | |
| this.obj = a; | |
| this.id = Tween.getId(); | |
| Tween.tweens[this.id] = this; | |
| f.onComplete && (this.onComplete = f.onComplete, delete f.onComplete); | |
| f.onUpdate && (this.onUpdate = f.onUpdate, delete f.onUpdate); | |
| f.ease && (this.ease = f.ease, delete f.ease); | |
| f.delay && (this.delay = f.delay, | |
| delete f.delay); | |
| for (prop in f) this.begin[prop] = a[prop]; | |
| this.playTimeout = setTimeout(function() { | |
| g.play() | |
| }, this.delay) | |
| }; | |
| this.play = function() { | |
| Tween.tweens[a] || (Tween.tweens[a] = []); | |
| Tween.tweens[a].push(this); | |
| this.endAt = (new Date).getTime() + this.time; | |
| GlobalEvents.addListener(GlobalEvent.RENDER_FRAME, this.mechanism) | |
| }; | |
| this.stop = function() { | |
| clearTimeout(g.playTimeout); | |
| GlobalEvents.removeListener(GlobalEvent.RENDER_FRAME, g.mechanism); | |
| g.stopped = !0 | |
| }; | |
| this.mechanism = function() { | |
| if (g.stopped) return !1; | |
| var a = g.endAt - | |
| (new Date).getTime(); | |
| 0 >= a ? (g.stop(), g.advanceFrame(1, 1), g.onUpdate(), g.onComplete()) : (g.advanceFrame(g.time - a, g.time), g.onUpdate()) | |
| }; | |
| this.advanceFrame = function(c, g) { | |
| for (prop in f) b = this.begin[prop], e = f[prop], m = e - b, a[prop] = this.ease(c, b, m, g) | |
| }; | |
| this.__construct__() | |
| }; | |
| Tween.id = 0; | |
| Tween.tweens = {}; | |
| Tween.killTweensOf = function(a) { | |
| for (var d in Tween.tweens) { | |
| var f = Tween.tweens[d]; | |
| f.obj == a && f.stop() | |
| } | |
| }; | |
| Tween.getId = function() { | |
| return ++Tween.id | |
| }; | |
| Ease = { | |
| linear: function(a, d, f, g) { | |
| return f * a / g + d | |
| }, | |
| easeOut: { | |
| quad: function(a, d, f, g) { | |
| return -f * (a /= g) * (a - 2) + d | |
| }, | |
| cubic: function(a, d, f, g) { | |
| return f * (Math.pow(a / g - 1, 3) + 1) + d | |
| }, | |
| quart: function(a, d, f, g) { | |
| return -f * (Math.pow(a / g - 1, 4) - 1) + d | |
| }, | |
| quint: function(a, d, f, g) { | |
| return f * (Math.pow(a / g - 1, 5) + 1) + d | |
| }, | |
| sine: function(a, d, f, g) { | |
| return f * Math.sin(a / g * (Math.PI / 2)) + d | |
| }, | |
| expo: function(a, d, f, g) { | |
| return f * (-Math.pow(2, -10 * a / g) + 1) + d | |
| }, | |
| circ: function(a, d, f, g) { | |
| return f * Math.sqrt(1 - (a = a / g - 1) * a) + d | |
| }, | |
| bounce: function(a, d, f, g) { | |
| return (a /= g) < 1 / 2.75 ? | |
| 7.5625 * f * a * a + d : a < 2 / 2.75 ? f * (7.5625 * (a -= 1.5 / 2.75) * a + 0.75) + d : a < 2.5 / 2.75 ? f * (7.5625 * (a -= 2.25 / 2.75) * a + 0.9375) + d : f * (7.5625 * (a -= 2.625 / 2.75) * a + 0.984375) + d | |
| }, | |
| back: function(a, d, f, g, c) { | |
| void 0 == c && (c = 1.70158); | |
| return f * ((a = a / g - 1) * a * ((c + 1) * a + c) + 1) + d | |
| } | |
| }, | |
| easeIn: { | |
| quad: function(a, d, f, g) { | |
| return f * (a /= g) * a + d | |
| }, | |
| cubic: function(a, d, f, g) { | |
| return f * Math.pow(a / g, 3) + d | |
| }, | |
| quart: function(a, d, f, g) { | |
| return f * Math.pow(a / g, 4) + d | |
| }, | |
| quint: function(a, d, f, g) { | |
| return f * Math.pow(a / g, 5) + d | |
| }, | |
| sine: function(a, d, f, g) { | |
| return f * (1 - Math.cos(a / g * (Math.PI / | |
| 2))) + d | |
| }, | |
| expo: function(a, d, f, g) { | |
| return f * Math.pow(2, 10 * (a / g - 1)) + d | |
| }, | |
| circ: function(a, d, f, g) { | |
| return f * (1 - Math.sqrt(1 - (a /= g) * a)) + d | |
| }, | |
| bounce: function(a, d, f, g) { | |
| return f - Ease._out.bounce(g - a, 0, f, g) + d | |
| }, | |
| back: function(a, d, f, g, c) { | |
| void 0 == c && (c = 1.70158); | |
| return f * (a /= g) * a * ((c + 1) * a - c) + d | |
| } | |
| }, | |
| easeInOut: { | |
| quad: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * a * a + d : -f / 2 * (--a * (a - 2) - 1) + d | |
| }, | |
| cubic: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * Math.pow(a, 3) + d : f / 2 * (Math.pow(a - 2, 3) + 2) + d | |
| }, | |
| quart: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * Math.pow(a, | |
| 4) + d : -f / 2 * (Math.pow(a - 2, 4) - 2) + d | |
| }, | |
| quint: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * Math.pow(a, 5) + d : f / 2 * (Math.pow(a - 2, 5) + 2) + d | |
| }, | |
| sine: function(a, d, f, g) { | |
| return f / 2 * (1 - Math.cos(Math.PI * a / g)) + d | |
| }, | |
| expo: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * Math.pow(2, 10 * (a - 1)) + d : f / 2 * (-Math.pow(2, -10 * --a) + 2) + d | |
| }, | |
| circ: function(a, d, f, g) { | |
| return 1 > (a /= g / 2) ? f / 2 * (1 - Math.sqrt(1 - a * a)) + d : f / 2 * (Math.sqrt(1 - (a -= 2) * a) + 1) + d | |
| }, | |
| bounce: function(a, d, f, g) { | |
| return a < g / 2 ? 0.5 * Ease._in.bounce(2 * a, 0, f, g) + d : 0.5 * Ease._out.bounce(2 * a - g, 0, f, g) + 0.5 * f + d | |
| }, | |
| back: function(a, | |
| d, f, g, c) { | |
| void 0 == c && (c = 1.70158); | |
| return 1 > (a /= g / 2) ? f / 2 * a * a * (((c *= 1.525) + 1) * a - c) + d : f / 2 * ((a -= 2) * a * (((c *= 1.525) + 1) * a + c) + 2) + d | |
| } | |
| } | |
| }; | |
| GlobalEvent = function(a, d) { | |
| this.name = a; | |
| this.data = d | |
| }; | |
| GlobalEvent.RENDER_FRAME = "global_event_render_frame"; | |
| GlobalEvent.WINDOW_RESIZE = "global_event_window_resize"; | |
| GlobalEvent.WINDOW_SCROLL = "global_event_window_scroll"; | |
| GlobalEvent.WINDOW_LOAD = "global_event_window_load"; | |
| GlobalEvents = { | |
| registry: {}, | |
| dispatch: function(a) { | |
| this.register(a.name); | |
| for (var d = this.registry[a.name], f = 0; f < d.length; f++) d[f](a) | |
| }, | |
| addListener: function(a, d) { | |
| this.register(a); | |
| this.registry[a].push(d) | |
| }, | |
| removeListener: function(a, d) { | |
| var f = this.registry[a]; | |
| if (!f) return !1; | |
| for (var g = 0; g < f.length; g++) d == f[g] && f.splice(g, 1) | |
| }, | |
| register: function(a) { | |
| this.registry[a] || (this.registry[a] = []) | |
| }, | |
| destroy: function(a) { | |
| this.registry[a] = !1 | |
| } | |
| }; | |
| KeyboardEvent = function(a, d) { | |
| this.name = a; | |
| this.keyCode = d.keyCode | |
| }; | |
| KeyboardEvent.KEY_DOWN = "keyboard_event_key_down"; | |
| KeyboardEvent.KEY_UP = "keyboard_event_key_up"; | |
| KeyCode = { | |
| UP: 38, | |
| LEFT: 37, | |
| RIGHT: 39, | |
| DOWN: 40 | |
| }; | |
| KeyboardEvents = { | |
| pressed: [], | |
| preventDefault: function(a) { | |
| KeyboardEvents.preventedKeys || (KeyboardEvents.preventedKeys = []); | |
| KeyboardEvents.preventedKeys.push(a) | |
| } | |
| }; | |
| document.onkeydown = function(a) { | |
| -1 == KeyboardEvents.pressed.indexOf(a.keyCode) && (KeyboardEvents.pressed.push(a.keyCode), GlobalEvents.dispatch(new KeyboardEvent(KeyboardEvent.KEY_DOWN, a))) | |
| }; | |
| document.onkeyup = function(a) { | |
| var d = KeyboardEvents.pressed.indexOf(a.keyCode); - 1 != d && (KeyboardEvents.pressed.splice(d, 1), GlobalEvents.dispatch(new KeyboardEvent(KeyboardEvent.KEY_UP, a))) | |
| }; | |
| MouseEvent = function(a, d) { | |
| this.name = a; | |
| this.data = d | |
| }; | |
| MouseEvent.ROLL_OVER = "mouse_event_roll_over"; | |
| MouseEvent.ROLL_OUT = "mouse_event_roll_out"; | |
| MouseEvent.MOUSE_UP = "mouse_event_mouse_up"; | |
| MouseEvent.MOUSE_DOWN = "mouse_event_mouse_down"; | |
| MouseEvent.CLICK = "mouse_event_click"; | |
| var R = { | |
| scrollbarWidth: 0, | |
| iOS: !1, | |
| iOSVersion: 0, | |
| mobile: !1, | |
| phone: !1, | |
| tablet: !1, | |
| renderEvent: new GlobalEvent(GlobalEvent.RENDER_FRAME), | |
| resizeEvent: new GlobalEvent(GlobalEvent.WINDOW_RESIZE), | |
| scrollEvent: new GlobalEvent(GlobalEvent.WINDOW_SCROLL), | |
| loadEvent: new GlobalEvent(GlobalEvent.WINDOW_LOAD), | |
| touch: "ontouchstart" in document.documentElement, | |
| init: function() { | |
| R.iOS = /iP(hone|od|ad)/.test(navigator.platform); | |
| if (R.iOS) { | |
| var a = navigator.appVersion.match(/OS (\d+)/); | |
| a && (R.iOSVersion = a[1]) | |
| } | |
| R.phone = -1 != document.body.className.indexOf("phone"); | |
| R.tablet = -1 != document.body.className.indexOf("tablet"); | |
| R.mobile = R.phone || R.tablet; | |
| R.scale = R.getPixelRatio(); | |
| R.mobile && GestureEvent.setup(); | |
| R.prefixData = R.getPrefixData(); | |
| window.onload = R.windowLoad; | |
| window.onresize = R.windowResize; | |
| window.onscroll = R.windowScroll | |
| }, | |
| domReady: function() { | |
| R.scrollbarWidth = R.getScrollBarWidth(); | |
| R.startRendering() | |
| }, | |
| windowLoad: function() { | |
| GlobalEvents.dispatch(R.loadEvent) | |
| }, | |
| windowResize: function() { | |
| clearTimeout(R.resizeTimeout); | |
| R.resizeTimeout = setTimeout(R.fireWindowResize, 120) | |
| }, | |
| fireWindowResize: function() { | |
| GlobalEvents.dispatch(R.resizeEvent) | |
| }, | |
| windowScroll: function() { | |
| clearTimeout(R.scrollTimeout); | |
| R.scrollTimeout = setTimeout(R.fireWindowScroll, 120) | |
| }, | |
| fireWindowScroll: function() { | |
| GlobalEvents.dispatch(R.scrollEvent) | |
| }, | |
| windowRender: function() { | |
| R.rendering && (R.prefixed.requestAnimationFrame(R.windowRender), GlobalEvents.dispatch(R.renderEvent)) | |
| }, | |
| startRendering: function(a) { | |
| R.rendering || (R.prefixed.requestAnimationFrame(R.windowRender), R.rendering = !0) | |
| }, | |
| stopRendering: function() { | |
| R.rendering = !1 | |
| }, | |
| onNextFrame: function(a) { | |
| setTimeout(function() { | |
| a() | |
| }, 32) | |
| }, | |
| getScrollBarWidth: function() { | |
| var a = document.createElement("p"); | |
| a.style.width = "100%"; | |
| a.style.height = "200px"; | |
| var d = document.createElement("div"); | |
| d.style.position = "absolute"; | |
| d.style.top = "0px"; | |
| d.style.left = "0px"; | |
| d.style.visibility = "hidden"; | |
| d.style.width = "200px"; | |
| d.style.height = "150px"; | |
| d.style.overflow = "hidden"; | |
| d.appendChild(a); | |
| document.body.appendChild(d); | |
| var f = a.offsetWidth; | |
| d.style.overflow = "scroll"; | |
| a = a.offsetWidth; | |
| f == a && (a = d.clientWidth); | |
| document.body.removeChild(d); | |
| return f - a | |
| }, | |
| getPrefixData: function() { | |
| var a, d = document.createElement("fake-element"), | |
| f = { | |
| transition: {}, | |
| transform: {} | |
| }, | |
| g = { | |
| transform: "transform", | |
| MozTransform: "-moz-transform", | |
| WebkitTransform: "-webkit-transform" | |
| }, | |
| c = { | |
| transition: "transition", | |
| MozTransition: "-moz-transition", | |
| WebkitTransition: "-webkit-transition" | |
| }, | |
| h = { | |
| transition: "transitionend", | |
| MozTransition: "transitionend", | |
| WebkitTransition: "webkitTransitionEnd" | |
| }; | |
| for (a in c) | |
| if (void 0 !== d.style[a]) { | |
| f.transition.jsProp = a; | |
| f.transition.cssProp = c[a]; | |
| break | |
| } | |
| for (a in g) | |
| if (void 0 !== | |
| d.style[a]) { | |
| f.transform.jsProp = a; | |
| f.transform.cssProp = g[a]; | |
| break | |
| } | |
| for (a in h) | |
| if (void 0 !== d.style[a]) { | |
| f.transition.endEvent = h[a]; | |
| break | |
| } | |
| return f | |
| }, | |
| onTransitionEnd: function(a, d, f, g) { | |
| f || (f = a); | |
| a.onTransitionEnd && (a.removeEventListener(R.prefixData.transition.endEvent, a.onTransitionEnd), delete a.onTransitionEnd); | |
| a.onTransitionEnd = function(c) { | |
| var h = c.srcElement || c.originalTarget; | |
| f && h != f || g && c.propertyName != g || (a.removeEventListener(R.prefixData.transition.endEvent, a.onTransitionEnd), delete a.onTransitionEnd, | |
| d()) | |
| }; | |
| a.addEventListener(R.prefixData.transition.endEvent, a.onTransitionEnd) | |
| }, | |
| setTransform: function(a, d) { | |
| a.style[R.prefixData.transform.jsProp] = d | |
| }, | |
| setTransition: function(a, d) { | |
| d = d.replace(/transform/g, R.prefixData.transform.cssProp); | |
| a.style[R.prefixData.transition.jsProp] = d; | |
| a.clientHeight | |
| }, | |
| id: function(a) { | |
| return document.getElementById(a) | |
| }, | |
| qs: function(a) { | |
| return document.querySelector(a) | |
| }, | |
| qsa: function(a) { | |
| return document.querySelectorAll(a) | |
| }, | |
| hasClass: function(a, d) { | |
| var f = !1, | |
| g = a.getAttribute("class"), | |
| c = | |
| " " + d + " "; - 1 < (" " + g + " ").replace(/[\n\t]/g, " ").indexOf(c) && (f = !0); | |
| return f | |
| }, | |
| addClass: function(a, d) { | |
| if (!R.hasClass(a, d)) { | |
| var f = a.getAttribute("class") + " " + d; | |
| a.setAttribute("class", f) | |
| } | |
| }, | |
| removeClass: function(a, d) { | |
| if (R.hasClass(a, d)) { | |
| var f = a.getAttribute("class").replace(RegExp("(?:^|\\s)" + d + "(?!\\S)"), ""); | |
| a.setAttribute("class", f) | |
| } | |
| }, | |
| toggleClass: function(a, d) { | |
| R.hasClass(a, d) ? R.removeClass(a, d) : R.addClass(a, d) | |
| }, | |
| isEmpty: function(a) { | |
| return null != a && void 0 !== typeof a ? !1 : !0 | |
| }, | |
| visible: function(a, d) { | |
| var f = document.body.getBoundingClientRect(), | |
| g = a.getBoundingClientRect().top - f.top, | |
| c = g + a.offsetHeight, | |
| h = window, | |
| f = h.scrollY, | |
| h = f + h.innerHeight, | |
| k; | |
| !0 === d ? k = c : (k = g, g = c); | |
| return g <= h && k >= f | |
| }, | |
| visiblePlus: function(a, d) { | |
| var f = document.body.getBoundingClientRect(), | |
| g = a.getBoundingClientRect().top - f.top, | |
| c = g + a.offsetHeight, | |
| h = window, | |
| f = h.scrollY - h.innerHeight, | |
| h = h.scrollY + h.innerHeight + h.innerHeight, | |
| k; | |
| !0 === d ? k = c : (k = g, g = c); | |
| return g <= h && k >= f | |
| }, | |
| getTransformY: function(a) { | |
| return parseFloat((a.transform || a.WebkitTransform).substr(22)) | |
| }, | |
| getTransformX: function(a) { | |
| return parseFloat((a.transform || | |
| a.WebkitTransform).split(",")[4]) | |
| }, | |
| getPixelRatio: function() { | |
| if (window.devicePixelRatio) return window.devicePixelRatio; | |
| if (window.matchMedia && window.matchMedia("(-moz-device-pixel-ratio: 2.0)").matches) return 2 | |
| }, | |
| redrawElement: function(a) { | |
| var d = a.style.display; | |
| a.style.display = "none"; | |
| a.style.display = d | |
| }, | |
| normalize: function(a, d, f, g, c) { | |
| return g + (a - d) / (f - d) * (c - g) | |
| } | |
| }; | |
| var DragHelper = function() { | |
| var a = this, | |
| d, f, g, c, h, k, l, n, p, r, q, s = !1; | |
| this.dragComplete = this.drag = void 0; | |
| this.init = function(a, c) { | |
| return this | |
| }; | |
| this.getDimensionX = function() { | |
| return window.innerWidth | |
| }; | |
| this.getDimensionY = function() { | |
| return window.innerHeight | |
| }; | |
| this.start = function(a) { | |
| a.touches && (a.clientX = a.touches[0].clientX, a.clientY = a.touches[0].clientY); | |
| l = a.clientX; | |
| k = a.clientY; | |
| g = new Date; | |
| p = a; | |
| q = r = h = c = 0; | |
| s = !1; | |
| R.touch ? (window.addEventListener("touchmove", this.inputMove), window.addEventListener("touchend", this.inputEnd)) : | |
| (window.addEventListener("mousemove", this.inputMove), window.addEventListener("mouseup", this.inputEnd)); | |
| return !0 | |
| }; | |
| this.stop = function() { | |
| R.touch ? (window.removeEventListener("touchmove", this.inputMove), window.removeEventListener("touchend", this.inputEnd)) : (window.removeEventListener("mousemove", this.inputMove), window.removeEventListener("mouseup", this.inputEnd)) | |
| }; | |
| this.getOutcome = function(a, c) { | |
| var g = DragHelper.OUTCOME_NONE; | |
| 90 <= a && 0 >= c || -90 >= a && 0 <= c ? g = DragHelper.OUTCOME_NONE : 0.15 <= c ? g = DragHelper.OUTCOME_BACK : | |
| -0.15 >= c && (g = DragHelper.OUTCOME_NEXT); | |
| return g | |
| }; | |
| this.inputEnd = function(f) { | |
| f = a.getOutcome(r, c / a.getDimensionX()); | |
| var d = a.getOutcome(q, h / a.getDimensionY()); | |
| 500 > new Date - g && 9 > Math.abs(c) && 9 > Math.abs(h) && (f = d = DragHelper.OUTCOME_CLICK); | |
| a.dragComplete(f, d); | |
| a.stop() | |
| }; | |
| this.inputMove = function(g) { | |
| g.touches && (g.clientX = g.touches[0].clientX, g.clientY = g.touches[0].clientY); | |
| var t = g.clientX - p.clientX, | |
| u = g.clientY - p.clientY; | |
| p.clientX > g.clientX && -1 != d ? (r = t, d = -1) : p.clientX < g.clientX && 1 != d && (r = t, d = 1); | |
| p.clientY > g.clientY && | |
| -1 != f ? (q = u, f = -1) : p.clientY < g.clientX && 1 != f && (q = u, f = 1); | |
| r += t / 2; | |
| q += u / 2; | |
| c = g.clientX - l; | |
| h = g.clientY - k; | |
| p = g; | |
| if (!s && a.onIntentClear) { | |
| var v = !1; | |
| 8 < Math.abs(h) ? (a.onIntentClear(DragHelper.DRAG_DIRECTION_Y, c, h, g.clientX, g.clientY, t, u), v = !0) : 8 < Math.abs(c) && (a.onIntentClear(DragHelper.DRAG_DIRECTION_X, c, h, g.clientX, g.clientY, t, u), v = !0); | |
| v && (l = g.clientX, k = g.clientY, c = g.clientX - l, h = g.clientY - k, s = !0) | |
| } | |
| clearTimeout(n); | |
| n = setTimeout(function() { | |
| _dragSpeed = 0 | |
| }, 120); | |
| if (a.onDrag && !a.onDrag(c, h, g.clientX, g.clientY, t, u)) return g.preventDefault(), !1 | |
| }; | |
| this.dragComplete = function(a, c) { | |
| if (this.onComplete) this.onComplete(a, c) | |
| }; | |
| this.enableTextSelection = function(a) { | |
| a.style.WebkitUserSelect = ""; | |
| a.style.cursor = ""; | |
| a.onselectstart = null; | |
| a.onmousedown = null | |
| }; | |
| this.disableTextSelection = function(a) { | |
| a.style.WebkitUserSelect = "none"; | |
| a.style.cursor = "-webkit-grabbing"; | |
| a.style.cursor = "-moz-grabbing"; | |
| a.style.cursor = "grabbing"; | |
| a.onselectstart = function() { | |
| return !1 | |
| }; | |
| a.onmousedown = function() { | |
| return !1 | |
| } | |
| } | |
| }; | |
| DragHelper.DRAG_DIRECTION_X = "DRAG_HELPER_DIRECTION_X"; | |
| DragHelper.DRAG_DIRECTION_Y = "DRAG_HELPER_DIRECTION_Y"; | |
| DragHelper.OUTCOME_CLICK = "DRAG_HELPER_OUTCOME_CLICK"; | |
| DragHelper.OUTCOME_NEXT = "DRAG_HELPER_OUTCOME_NEXT"; | |
| DragHelper.OUTCOME_BACK = "DRAG_HELPER_OUTCOME_BACK"; | |
| DragHelper.OUTCOME_NONE = "DRAG_HELPER_OUTCOME_NONE"; | |
| R = R || {}; | |
| R.Prefixed = function() { | |
| var a = null, | |
| d = "", | |
| f = { | |
| cursor: [{ | |
| value: "grab", | |
| pattern: /grab/ | |
| }], | |
| transition: [{ | |
| value: "transform 1s ease 0s", | |
| pattern: /transform/ | |
| }] | |
| }, | |
| g = ""; | |
| this.init = function() { | |
| a = document.createElement("div"); | |
| a: { | |
| for (var n in a.style) { | |
| var p = n.toLowerCase().match(/^(webkit|moz|ms)/); | |
| if (p) { | |
| d = "-" + p[1] + "-"; | |
| break a | |
| } | |
| } | |
| d = "" | |
| } | |
| n = {}; | |
| for (var r in f) | |
| if (prop = c(r)) | |
| for (var q in f[r]) | |
| if (p = f[r][q], a.style[prop] = p.value, a.style[prop] != p.value) { | |
| var s = p.value.replace(p.pattern, d + "$&"); | |
| a.style[prop] = s; | |
| a.style[prop] == s && (n[r] || | |
| (n[r] = []), n[r].push(p.pattern)) | |
| } | |
| f = n; | |
| r = c("transition"); | |
| g = "-webkit-transition" == r ? "WebkitTransitionEnd" : r ? "transitionend" : void 0; | |
| this.prefix = d; | |
| this.style = c; | |
| this.setStyle = h; | |
| this.onTransitionEnd = k; | |
| this.requestAnimationFrame = l(60); | |
| return this | |
| }; | |
| var c = function(g, h) { | |
| if (!h) return g in a.style ? g : d + g in a.style ? d + g : !1; | |
| var k = f[g], | |
| l; | |
| for (l in k) h = h.replace(k[l], d + "$&"); | |
| g = c(g); | |
| a.style[g] = ""; | |
| a.style[g] = h; | |
| return a.style[g] ? h : !1 | |
| }, | |
| h = function(a, g, f) { | |
| f = c(g, f); | |
| return (g = c(g)) && f ? (a.style[g] = f, a.style[g]) : !1 | |
| }, | |
| k = function(a, | |
| f, d) { | |
| if (!a || !f || !d) throw "Missing parameters"; | |
| a.removeEventListener(g, a.onTransitionEnd); | |
| a.onTransitionEnd = function(h) { | |
| if (h.target != a || h.propertyName != c(d)) return !1; | |
| a.removeEventListener(g, a.onTransitionEnd); | |
| delete a.onTransitionEnd; | |
| f() | |
| }; | |
| a.addEventListener(g, a.onTransitionEnd) | |
| }, | |
| l = function(a) { | |
| var c = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function(a) { | |
| window.setTimeout(a, 1E3 / 60) | |
| }; | |
| return function(a) { | |
| c.call(window, a) | |
| } | |
| } | |
| }; | |
| R.prefixed = (new R.Prefixed).init(); | |
| R.Nav = function() { | |
| var a = this; | |
| this.html = {}; | |
| this.open = !1; | |
| this.delegate = null; | |
| this.contentMode = !1; | |
| this.init = function(a) { | |
| this.delegate = a; | |
| this.html.siteNavDiv = R.qs(".site-nav"); | |
| this.html.navPaginationDiv = R.qs(".nav-pagination"); | |
| this.html.navBarBgDiv = R.qs(".nav-bar-bg"); | |
| this.html.navBarDiv = R.qs(".nav-bar"); | |
| this.html.navLogoLink = R.qs(".nav-link-logo"); | |
| this.html.navMenuLink = R.qs(".nav-link-menu"); | |
| this.html.navMenuLinkOuter = R.qs(".nav-link-menu-outer"); | |
| this.html.navMenuContent = R.qs("#nav-menu-content"); | |
| this.html.navMenuDiv = | |
| R.qs("#nav-menu"); | |
| this.html.navMenuContentCopies = R.qsa(".nav-menu-content"); | |
| this.html.navPaginationList = R.qs(".nav-pagination ul"); | |
| this.html.siteHeadPaginationDiv = R.qs(".site-head-pagination"); | |
| this.html.baseContentDivs = R.qsa(".nav-menu-base-content"); | |
| this.html.foldContentDivs = R.qsa(".nav-menu-fold-content"); | |
| this.html.menuLinks = R.qsa("#nav-menu-content a"); | |
| this.html.navMenuLink.onclick = this.menuClick.bind(this); | |
| this.initMenuContent(); | |
| this.addListeners(); | |
| this.resize(); | |
| return this | |
| }; | |
| this.addListeners = | |
| function() { | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_RESIZE, this.resize.bind(this)); | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_LOAD, this.resize.bind(this)); | |
| for (var a = 0; a < this.html.menuLinks.length; a++) this.html.menuLinks[a].onclick = this.menuLinkClick; | |
| this.html.navLogoLink.onclick = this.logoClick.bind(this) | |
| }; | |
| this.menuLinkClick = function(d) { | |
| d.stopPropagation(); | |
| return a.delegate.menuLinkClick(this) | |
| }; | |
| this.logoClick = function(a) { | |
| a.stopPropagation(); | |
| this.delegate.navLogoClick(); | |
| return !1 | |
| }; | |
| this.initMenuContent = | |
| function() { | |
| for (var a = this.html.navMenuContent.innerHTML, f = this.html.navMenuContentCopies.length; f--;) this.html.navMenuContentCopies[f].innerHTML = a | |
| }; | |
| this.resize = function() { | |
| for (var a = document.documentElement.clientWidth, f = this.html.navMenuContentCopies.length; f--;) this.html.navMenuContentCopies[f].style.width = a + "px" | |
| }; | |
| this.menuClick = function(d) { | |
| d.stopPropagation(); | |
| a.delegate.menuClick(); | |
| return !1 | |
| }; | |
| this.menuWillOpen = function() { | |
| this.contentMode == R.Site.CONTENT_MODE_CONTENT ? (R.setTransition(this.html.navPaginationDiv, | |
| "opacity .25s linear"), this.html.navPaginationDiv.style.opacity = "0") : (R.setTransition(this.html.siteHeadPaginationDiv, "opacity .25s linear"), this.html.siteHeadPaginationDiv.style.opacity = "0"); | |
| window.oldtouchmove = window.ontouchmove; | |
| window.ontouchmove = function(a) { | |
| a.stopPropagation(); | |
| return !1 | |
| }; | |
| R.setTransition(this.html.navLogoLink, "opacity .25s linear"); | |
| this.html.navLogoLink.style.opacity = "0"; | |
| R.onTransitionEnd(this.html.navLogoLink, function() { | |
| a.html.siteHeadPaginationDiv.style.display = "none"; | |
| a.html.navPaginationDiv.style.display = | |
| "none"; | |
| a.html.navLogoLink.style.display = "none" | |
| }); | |
| R.addClass(a.html.navMenuLink, "active") | |
| }; | |
| this.menuWillClose = function() { | |
| this.contentMode == R.Site.CONTENT_MODE_CONTENT ? (this.html.navPaginationDiv.style.display = "block", R.setTransition(this.html.navPaginationDiv, "opacity .25s linear"), this.html.navPaginationDiv.style.opacity = "1") : (this.html.siteHeadPaginationDiv.style.display = "block", R.setTransition(this.html.siteHeadPaginationDiv, "opacity .25s linear .85s"), this.html.siteHeadPaginationDiv.style.opacity = | |
| "1"); | |
| window.ontouchmove = window.oldtouchmove; | |
| this.html.navLogoLink.style.display = ""; | |
| R.setTransition(this.html.navLogoLink, "opacity .25s linear"); | |
| this.html.navLogoLink.style.opacity = "1"; | |
| R.removeClass(this.html.navMenuLink, "active") | |
| }; | |
| this.openMenu = function(d) { | |
| a.html.navMenuDiv.style.display = "block"; | |
| a.html.navMenuDiv.clientWidth; | |
| R.addClass(a.html.siteNavDiv, "nav-menu-open animating"); | |
| R.onTransitionEnd(a.html.navMenuContent, function() { | |
| R.removeClass(a.html.siteNavDiv, "animating"); | |
| d && d() | |
| }) | |
| }; | |
| this.closeMenu = | |
| function(d) { | |
| R.addClass(a.html.siteNavDiv, "animating"); | |
| R.removeClass(a.html.siteNavDiv, "nav-menu-open"); | |
| R.onTransitionEnd(a.html.navMenuDiv, function() { | |
| R.removeClass(a.html.siteNavDiv, "animating"); | |
| a.html.navMenuDiv.style.display = "none"; | |
| d && d() | |
| }) | |
| }; | |
| this.setForegroundColor = function(a) { | |
| this.html.navBarBgDiv.style.backgroundColor = a; | |
| for (var f = 0; f < this.html.baseContentDivs.length; f++) { | |
| var g = this.html.baseContentDivs[f]; | |
| g.style.backgroundColor = a | |
| } | |
| for (f = 0; f < this.html.foldContentDivs.length; f++) g = this.html.foldContentDivs[f], | |
| g.style.backgroundColor = a; | |
| this.html.navMenuContent.style.backgroundColor = a | |
| }; | |
| this.setBackgroundColor = function(a) { | |
| this.html.navBarDiv.style.backgroundColor = a | |
| }; | |
| this.enterContentMode = function() { | |
| if (this.contentMode) return !1; | |
| this.contentMode = !0; | |
| this.useLightIcons() | |
| }; | |
| this.exitContentMode = function() { | |
| if (!this.contentMode) return !1; | |
| this.contentMode = !1; | |
| this.useDarkIcons() | |
| }; | |
| this.useLightIcons = function() { | |
| R.addClass(this.html.navMenuLink, "content-mode"); | |
| R.addClass(this.html.navLogoLink, "content-mode") | |
| }; | |
| this.useDarkIcons = | |
| function() { | |
| R.removeClass(this.html.navMenuLink, "content-mode"); | |
| R.removeClass(this.html.navLogoLink, "content-mode") | |
| }; | |
| this.showBg = function() { | |
| this.html.navBarBgDiv.style.visibility = "visible" | |
| }; | |
| this.hideBg = function() { | |
| this.html.navBarBgDiv.style.visibility = "hidden" | |
| }; | |
| this.hidePagination = function(d) { | |
| d ? (R.setTransition(this.html.navPaginationDiv, ""), this.html.navPaginationDiv.style.display = "none") : (R.setTransition(this.html.navPaginationDiv, "opacity .2s linear"), this.html.navPaginationDiv.style.opacity = "0", | |
| R.onTransitionEnd(this.html.navPaginationDiv, function() { | |
| a.html.navPaginationDiv.style.display = "none" | |
| })) | |
| }; | |
| this.showPagination = function() { | |
| this.html.navPaginationDiv.style.display = "block"; | |
| this.html.navPaginationDiv.style.opacity = "0"; | |
| R.onNextFrame(function() { | |
| R.setTransition(a.html.navPaginationDiv, "opacity .2s linear"); | |
| a.html.navPaginationDiv.style.opacity = "1" | |
| }) | |
| }; | |
| this.updateMenuStatus = function() { | |
| this.html.navMenuDiv.setAttribute("data-path", window.location.pathname) | |
| } | |
| }; | |
| R.Pagination = function() { | |
| var a = this; | |
| this.html = { | |
| sitePaginationDiv: null, | |
| navPaginationList: null, | |
| navPaginationItems: [], | |
| navPaginationLinks: [] | |
| }; | |
| this.open = !1; | |
| this.page = 0; | |
| this.inverted = !1; | |
| this.delegate = null; | |
| this.init = function(a, f) { | |
| this.delegate = a; | |
| this.html.sitePaginationDiv = f; | |
| this.html.sitePaginationList = f.querySelector("ul"); | |
| this.html.sitePaginationItems = f.querySelectorAll("li"); | |
| this.html.sitePaginationLinks = f.querySelectorAll("a"); | |
| for (var g = 0; g < this.html.sitePaginationItems.length; g++) | |
| if (/selected/.test(this.html.sitePaginationItems[g].className)) { | |
| this.page = | |
| g; | |
| break | |
| } | |
| for (g = 0; g < this.html.sitePaginationLinks.length; g++) this.html.sitePaginationLinks[g].onclick = this.pageClick; | |
| return this | |
| }; | |
| this.pageClick = function(d) { | |
| d.stopPropagation(); | |
| for (d = 0; d < a.html.sitePaginationLinks.length && a.html.sitePaginationLinks[d] != this; d++); | |
| a.delegate.paginationClick(d); | |
| return !1 | |
| }; | |
| this.show = function() { | |
| this.html.sitePaginationDiv.style.display = "block" | |
| }; | |
| this.hide = function() { | |
| this.html.sitePaginationDiv.style.display = "none" | |
| }; | |
| this.invertIcons = function() { | |
| this.html.sitePaginationList.style.borderColor = | |
| this.inverted ? "" : "#fff"; | |
| this.inverted = !this.inverted | |
| }; | |
| this.enterContentMode = function() { | |
| this.html.sitePaginationDiv.style.position = "fixed"; | |
| this.html.sitePaginationDiv.style.top = "0" | |
| }; | |
| this.exitContentMode = function() { | |
| this.html.sitePaginationDiv.style.position = ""; | |
| this.html.sitePaginationDiv.style.top = "" | |
| }; | |
| this.setPage = function(a, f) { | |
| if (a != this.page) { | |
| var g = this.delegate.getRealIndex(this.page), | |
| c = this.delegate.getRealIndex(a); | |
| R.removeClass(this.html.sitePaginationItems[g], "selected"); | |
| R.addClass(this.html.sitePaginationItems[c], | |
| "selected"); | |
| this.page = a | |
| } | |
| } | |
| }; | |
| R.Badge = function() { | |
| var a = this, | |
| d = this.site = null, | |
| f = { | |
| value: 0 | |
| }; | |
| this.html = { | |
| siteBadgeDiv: null, | |
| siteBadgeContentDiv: null, | |
| badgeControlsDiv: null, | |
| badgeNextLink: null, | |
| badgeBackLink: null, | |
| badgeCurrentSpan: null, | |
| badgeTotalSpan: null | |
| }; | |
| this.init = function(a) { | |
| this.site = a; | |
| this.html.siteBadgeDiv = R.qs(".site-badge"); | |
| this.html.siteBadgeContentDiv = R.qs(".site-badge-content"); | |
| this.html.siteBadgePerspectiveDiv = R.qs(".site-badge-perspective"); | |
| this.html.badgeControlsDiv = R.qs(".badge-controls"); | |
| this.html.badgeCurrentSpan = R.qs(".badge-current"); | |
| this.html.badgeTotalSpan = R.qs(".badge-total"); | |
| this.html.badgeNextLink = R.qs(".badge-next-link"); | |
| this.html.badgeBackLink = R.qs(".badge-back-link"); | |
| this.html.badgeBackSpan = R.qs(".badge-back"); | |
| this.html.badgeNextSpan = R.qs(".badge-next"); | |
| this.page = parseInt(this.html.badgeCurrentSpan.innerHTML) - 1; | |
| this.addListeners(); | |
| return this | |
| }; | |
| this.addListeners = function() { | |
| this.html.badgeNextLink.onmouseover = this.nextOver; | |
| this.html.badgeBackLink.onmouseover = this.backOver; | |
| this.html.badgeNextLink.onclick = this.nextClick; | |
| this.html.badgeBackLink.onclick = | |
| this.backClick; | |
| this.html.badgeNextLink.onmouseout = this.nextOut; | |
| this.html.badgeBackLink.onmouseout = this.backOut | |
| }; | |
| this.nextClick = function() { | |
| a.site.badgeNextClick(); | |
| return !1 | |
| }; | |
| this.backClick = function() { | |
| a.site.badgeBackClick(); | |
| return !1 | |
| }; | |
| this.nextOver = function() { | |
| a.html.badgeNextSpan.style.opacity = "1"; | |
| a.animating || a.tilt(30) | |
| }; | |
| this.nextOut = function() { | |
| a.html.badgeNextSpan.style.opacity = ".2"; | |
| a.animating || a.tilt(0) | |
| }; | |
| this.backOver = function() { | |
| a.html.badgeBackSpan.style.opacity = "1"; | |
| a.animating || a.tilt(-30) | |
| }; | |
| this.backOut = | |
| function() { | |
| a.html.badgeBackSpan.style.opacity = ".2"; | |
| a.animating || a.tilt(0) | |
| }; | |
| this.tilt = function(g) { | |
| d && d.stop(); | |
| d = new Tween(f, 500, { | |
| ease: Ease.easeOut.sine, | |
| value: g, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteBadgePerspectiveDiv, "rotateY(" + f.value + "deg)") | |
| }, | |
| onComplete: function() { | |
| 0 == f.value && R.setTransform(a.html.siteBadgePerspectiveDiv, "") | |
| } | |
| }) | |
| }; | |
| this.setPage = function(g, c, h, k) { | |
| if (g != this.page) { | |
| if (h) { | |
| d && d.stop(); | |
| this.animating = !0; | |
| var l = k ? 200 : 400; | |
| R.setTransition(this.html.siteBadgePerspectiveDiv, "none"); | |
| new Tween(f, | |
| l, { | |
| ease: Ease.easeIn.sine, | |
| value: 90 * c, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteBadgePerspectiveDiv, "rotateY(" + f.value + "deg)") | |
| }, | |
| onComplete: function() { | |
| new Tween(f, l, { | |
| ease: Ease.easeOut.sine, | |
| value: 0, | |
| delay: 50, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteBadgePerspectiveDiv, "rotateY(" + -1 * f.value + "deg)") | |
| }, | |
| onComplete: function() { | |
| R.setTransform(a.html.siteBadgePerspectiveDiv, ""); | |
| a.animating = !1 | |
| } | |
| }); | |
| a.html.badgeCurrentSpan.innerHTML = a.site.getRealIndex(g) + 1 | |
| } | |
| }) | |
| } else a.html.badgeCurrentSpan.innerHTML = a.site.getRealIndex(g) + | |
| 1; | |
| this.page = g | |
| } | |
| } | |
| }; | |
| R.Site = function() { | |
| var a = this; | |
| R.Site.historyState = null; | |
| var d = R.Site.CONTENT_MODE_CONTENT, | |
| f = R.Site.CONTENT_MODE_MASTHEAD; | |
| this.html = {}; | |
| this.animations = this.navPagination = this.headerPagination = this.badge = this.nav = null; | |
| this.mobileSize = this.pagesLoaded = !1; | |
| this.ribbonManager = this.ribbonCenter = this.ribbon = null; | |
| this.ribbonColorTransitions = []; | |
| this.mouseWheelSuspended = this.menuOpen = this.animating = !1; | |
| this.mouseWheelSpeedY = this.mouseWheelSpeedX = this.mouseWheelLastY = this.mouseWheelLastX = this.mouseWheelDirection = | |
| 0; | |
| this.dragHelper = null; | |
| this.dragging = this.dragSuspended = !1; | |
| this.dragSide = this.dragOffset = 0; | |
| this.contentMode = f; | |
| this.pageIndex = PAGE_INDEX; | |
| this.pagesLength = PAGE_DATA.length; | |
| this.navHeight = this.ribbonWidth = 0; | |
| this.navArrowShowing = !0; | |
| this.currentFooter = null; | |
| this.footerShowing = !1; | |
| this.dribbbleShots = []; | |
| this.pageBodyImages = []; | |
| this.pageBodyBgDivs = []; | |
| this.init = function() { | |
| if ("simple" != document.body.className) return this.html.siteDiv = R.qs(".site"), this.html.siteBodyDiv = R.qs(".site-body"), this.html.siteBodyPageAreaDiv = | |
| R.qs(".site-body .page-area"), this.html.siteNavDiv = R.qs(".site-nav"), this.html.navBarBgDiv = R.qs(".nav-bar-bg"), this.html.navMenuLink = R.qs(".nav-link-menu"), this.html.navPaginationDiv = R.qs(".nav-pagination"), this.html.navPaginationList = R.qs(".nav-pagination ul"), this.html.navDirectionDiv = R.qs(".site-nav .nav-direction"), this.html.navArrowLink = R.qs(".site-nav a.nav-arrow"), this.html.siteHeadDiv = R.qs(".site-head"), this.html.siteHeadPageAreaDiv = R.qs(".site-head .page-area"), this.html.siteHeadPaginationDiv = | |
| R.qs(".site-head-pagination"), this.html.siteHeadArrowsDiv = R.qs(".site-head-arrows"), this.html.siteHeadDirectionDiv = R.qs(".site-head .site-direction"), this.html.siteHeadDownArrowLink = R.qs(".site-head a.down-arrow"), this.html.siteRibbonDiv = R.qs(".site-ribbon"), this.html.pageHeadDivs = Array(PAGE_DATA.length), this.html.pageHeadDivs[this.pageIndex] = R.qs(".page-head"), this.html.pageBodyDivs = Array(PAGE_DATA.length), this.html.pageBodyDivs[this.pageIndex] = R.qs(".page-body"), this.html.pageBodyImages = Array(PAGE_DATA.length), | |
| this.html.pageBodyBgDivs = Array(PAGE_DATA.length), this.html.pageContentDivs = Array(PAGE_DATA.length), this.html.pageContentDivs[this.pageIndex] = R.qs(".page-content"), this.nav = (new R.Nav).init(this), this.badge = (new R.Badge).init(this), this.navPagination = (new R.Pagination).init(this, this.html.navPaginationDiv), this.headerPagination = (new R.Pagination).init(this, this.html.siteHeadPaginationDiv), this.dragHelper = (new DragHelper).init(), this.createRibbon(), this.loadPages(), R.touch || (document.body.style.overflow = | |
| "hidden"), R.touch && (this.html.siteDiv.style.overflow = "hidden", window.onload = function() { | |
| setTimeout(function() { | |
| a.html.siteDiv.style.overflow = ""; | |
| R.redrawElement(document.body) | |
| }, 32) | |
| }), 0 < R.scrollbarWidth && (this.html.pageBodyDivs[this.pageIndex].style.paddingRight = R.scrollbarWidth + "px", 0 == this.pageIndex && this.adjustStudioHeader()), this.nav.setForegroundColor(this.getPrimaryColor()), this | |
| }; | |
| this.adjustStudioHeader = function() { | |
| R.qs("#studio header").style.marginRight = -R.scrollbarWidth + "px" | |
| }; | |
| this.loadPages = function() { | |
| new Ajax({ | |
| method: "GET", | |
| path: "/surrounding/" + PAGE_DATA[this.pageIndex].slug + "/", | |
| onComplete: this.onPagesLoaded.bind(this) | |
| }) | |
| }; | |
| this.onPagesLoaded = function(a) { | |
| var c = this.html.pageBodyDivs[this.pageIndex]; | |
| c.insertAdjacentHTML("beforebegin", a.html_before); | |
| c.insertAdjacentHTML("afterend", a.html_after); | |
| c = this.html.pageHeadDivs[this.pageIndex]; | |
| c.insertAdjacentHTML("beforebegin", a.header_html_before); | |
| c.insertAdjacentHTML("afterend", a.header_html_after); | |
| this.html.pageBodyDivs = R.qsa(".page-body"); | |
| this.html.pageHeadDivs = R.qsa(".page-head"); | |
| this.html.pageContentDivs = R.qsa(".page-content"); | |
| this.pagesLoaded = !0; | |
| 0 < R.scrollbarWidth && this.adjustStudioHeader(); | |
| this.findInternalLinks(); | |
| this.setupDribbbleShots(); | |
| if (R.touch) { | |
| a = this.html.pageContentDivs[0].getElementsByClassName("person"); | |
| new TapBios(a); | |
| c = this.html.pageContentDivs[0].getElementsByClassName("client"); | |
| for (a = c.length - 1; 0 <= a; a--) new TapNonHoverable(c[a]); | |
| c = this.html.pageContentDivs[0].getElementsByClassName("award"); | |
| for (a = c.length - 1; 0 <= a; a--) new TapNonHoverable(c[a]) | |
| } | |
| var f = this, | |
| c = | |
| R.qsa(".page-head-actions a"); | |
| for (a = 0; a < c.length; a++) c[a].onclick = function(a) { | |
| a = f.getPageIndexForPath(this.pathname); | |
| var c = a > f.pageIndex ? 1 : -1; | |
| a == f.pageIndex ? f.animateToContent() : f.animateToHeaderIndex(a, c, !0); | |
| return !1 | |
| }; | |
| this.enableDragging(); | |
| this.addListeners() | |
| }; | |
| this.resizeRibbon = function() { | |
| 768 > window.innerWidth ? (this.ribbonWidth = 60, this.navHeight = 40) : (this.ribbonWidth = 136, this.navHeight = 60); | |
| var a = R.id("ribbon"); | |
| a.width = window.innerWidth * R.scale; | |
| a.height = window.innerHeight * R.scale; | |
| a.style.width = window.innerWidth + | |
| "px"; | |
| a.style.height = window.innerHeight + this.navHeight + "px"; | |
| this.ribbon && (this.ribbon.setWidth(this.ribbonWidth, this.navHeight), this.ribbon.straighten(), this.ribbon.resetSize()) | |
| }; | |
| this.createRibbon = function() { | |
| this.ribbon = new Ribbon(R.id("ribbon"), PAGE_DATA[this.pageIndex].colors.ribbonPrimary, PAGE_DATA[this.pageIndex].colors.ribbonSecondary, R.scale); | |
| this.resizeRibbon(); | |
| this.ribbonManager = new RibbonInteractionManager(this.ribbon) | |
| }; | |
| this.addListeners = function() { | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_RESIZE, | |
| this.onResize.bind(this)); | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_SCROLL, this.onScroll.bind(this)); | |
| this.html.siteHeadDownArrowLink.onclick = this.downArrowClick.bind(this); | |
| window.onkeydown = this.onKeyDown.bind(this); | |
| if (!R.touch) { | |
| var a = document.documentElement; | |
| a.addEventListener("mousewheel", this.onMouseWheel.bind(this), !1); | |
| a.addEventListener("wheel", this.onMouseWheel.bind(this), !1); | |
| window.onunload = function() { | |
| window.scrollTo(0, 0) | |
| } | |
| } | |
| window.onpopstate = this.onPopState.bind(this); | |
| window.history.state || | |
| (a = { | |
| count: 0 | |
| }, R.Site.historyState = a, window.history.replaceState(a, document.title, window.location.pathname)); | |
| R.Site.historyCount = window.history.state.count; | |
| this.onResize() | |
| }; | |
| this.downArrowClick = function() { | |
| this.animateToContent(); | |
| return !1 | |
| }; | |
| this.upArrowClick = function() { | |
| this.animateToMasthead(); | |
| return !1 | |
| }; | |
| this.onScroll = function() { | |
| if (this.contentMode == d) { | |
| for (var a = 0; a < this.icons.length; a++) { | |
| var c = this.icons[a]; | |
| R.visible(c, !0) && R.addClass(c, "case-study-icon-anim") | |
| }!this.footerShowing && window.innerHeight > this.currentFooter.getBoundingClientRect().top ? | |
| (this.footerShowing = !0, R.startRendering(), this.dribbbleShots[this.pageIndex] && this.dribbbleShots[this.pageIndex].setOnscreen(!0)) : this.footerShowing && window.innerHeight < this.currentFooter.getBoundingClientRect().top && (this.footerShowing = !1, R.stopRendering(), this.dribbbleShots[this.pageIndex] && this.dribbbleShots[this.pageIndex].setOnscreen(!1)) | |
| } | |
| this.loadVisibleImages(); | |
| this.loadVisibleBgDivs() | |
| }; | |
| this.onResize = function() { | |
| !this.mobileSize && 768 > window.innerWidth ? (this.mobileSize = !0, this.updateDownArrow()) : | |
| this.mobileSize && 768 <= window.innerWidth && (this.mobileSize = !1, this.updateDownArrow()); | |
| this.contentMode == f && this.resizeRibbon(); | |
| this.currentFooter = this.html.pageBodyDivs[this.pageIndex].getElementsByTagName("footer")[0] | |
| }; | |
| this.onFontsReady = function() {}; | |
| this.getRealIndex = function(a) { | |
| a %= this.pagesLength; | |
| 0 > a && (a += this.html.pageBodyDivs.length); | |
| return a | |
| }; | |
| this.getBackgroundColor = function(a) { | |
| void 0 === a && (a = this.pageIndex); | |
| a = this.getRealIndex(a); | |
| return PAGE_DATA[a].colors.background | |
| }; | |
| this.getPrimaryColor = function(a) { | |
| void 0 === | |
| a && (a = this.pageIndex); | |
| a = this.getRealIndex(a); | |
| return PAGE_DATA[a].colors.ribbonPrimary | |
| }; | |
| this.getSecondaryColor = function(a) { | |
| void 0 === a && (a = this.pageIndex); | |
| a = this.getRealIndex(a); | |
| return PAGE_DATA[a].colors.ribbonSecondary | |
| }; | |
| this.updateHeaders = function() { | |
| var a = this.html.pageHeadDivs[this.pageIndex]; | |
| a.style.display = "block"; | |
| a.style.right = ""; | |
| a.style.left = ""; | |
| for (a = 0; a < this.html.pageHeadDivs.length; a++) | |
| if (a != this.pageIndex) { | |
| var c = this.html.pageHeadDivs[a]; | |
| c.style.display = "none"; | |
| c.style.right = ""; | |
| c.style.left = | |
| "" | |
| } | |
| this.updateDownArrow() | |
| }; | |
| this.activateIcons = function() { | |
| this.icons = this.html.pageBodyDivs[this.pageIndex].querySelectorAll(".case-study-icon"); | |
| for (var a = 0; a < this.icons.length; a++) R.addClass(this.icons[a], "case-study-icon-ready") | |
| }; | |
| this.activateSlideshows = function() { | |
| for (var a = this.html.pageBodyDivs[this.pageIndex], c = a.querySelectorAll(".slideshow"), f = a.querySelectorAll(".device-slideshow"), d = a.querySelectorAll(".simple-slideshow"), l = a.querySelectorAll(".slideshow, .device-slideshow, .simple-slideshow"), | |
| n = 0; n < l.length; n++) a = l[n], a.slideshow && a.slideshow.deactivate(); | |
| for (l = 0; l < c.length; l++) a = c[l], a.slideshow || (a.slideshow = (new R.Slideshow).init(a)), a.slideshow.activate(); | |
| for (c = 0; c < f.length; c++) a = f[c], a.slideshow || (a.slideshow = (new R.DeviceSlider).init(a)), a.slideshow.activate(); | |
| for (f = 0; f < d.length; f++) c = d[f], c.slideshow || (c.slideshow = (new R.SimpleSlider).init(c)), c.slideshow.activate() | |
| }; | |
| this.activateVideoPlayers = function() { | |
| for (var a = this.html.pageBodyDivs[this.pageIndex].querySelectorAll(".device-screen > .video-player"), | |
| c = 0; c < a.length; c++) { | |
| var f = a[c]; | |
| f.videoPlayer || (f.videoPlayer = (new R.VideoPlayer).init(f)) | |
| } | |
| }; | |
| this.activateCodeSnippets = function() { | |
| for (var a = this.html.pageBodyDivs[this.pageIndex], c = a.querySelectorAll(".code-collection"), f = a.querySelectorAll(".code-sample"), d = a.querySelectorAll(".code-sample code"), l = a.querySelectorAll(".code-sample pre"), a = a.querySelectorAll(".code-expand-button"), n = a.length; n--;) { | |
| var p = a[n]; | |
| p.collection = c[n]; | |
| p.sample = f[n]; | |
| p.code = d[n]; | |
| p.pre = l[n]; | |
| p.code.style.top = R.scrollbarWidth + "px"; | |
| p.code.style.marginTop = "-" + R.scrollbarWidth + "px"; | |
| p.addEventListener("click", function() { | |
| R.hasClass(this.collection, "expanded") ? (R.removeClass(this.collection, "expanded"), this.sample.style.height = "") : (R.addClass(this.collection, "expanded"), this.sample.style.height = this.pre.clientHeight + "px") | |
| }) | |
| } | |
| }; | |
| this.updateContent = function() { | |
| for (var a = 0; a < this.html.pageBodyDivs.length; a++) { | |
| var c = this.html.pageBodyDivs[a]; | |
| c.style.display = "none" | |
| } | |
| c = this.html.pageBodyDivs[this.pageIndex]; | |
| c.style.display = "block"; | |
| 0 < R.scrollbarWidth && | |
| (c.style.paddingRight = R.scrollbarWidth + "px"); | |
| c = c.querySelectorAll(".page-section"); | |
| for (a = 0; a < c.length; a++) c[a].style.display = "none"; | |
| c[0].style.display = ""; | |
| c[1].style.display = ""; | |
| this.nav.setForegroundColor(this.getPrimaryColor()); | |
| this.html.siteBodyDiv.style.backgroundColor = this.getBackgroundColor(); | |
| this.updateImages() | |
| }; | |
| this.animateToContent = function() { | |
| if (!(this.animating || this.menuOpen || this.dragging)) { | |
| this.animating = !0; | |
| var f = this.ribbon.getCurrentVerticalPosition(); | |
| this.ribbon.verticalPosition = f; | |
| this.ribbon.positionDamping = | |
| 1; | |
| this.ribbon.canDestruct = !1; | |
| var c = window.innerHeight, | |
| h = (c - a.navHeight) / c, | |
| k = !1, | |
| l = { | |
| value: 0 | |
| }; | |
| new Tween(l, 860, { | |
| value: window.innerHeight, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + -l.value + "px,0)"); | |
| var d = l.value / c, | |
| p = Math.min(d, 1); | |
| a.ribbon.straightenStrength = Math.min(p, 1); | |
| a.ribbon.verticalPosition = f - f * p; | |
| a.ribbon.straighten(); | |
| d >= h && (0 < R.scrollbarWidth && (d = R.normalize(d, h, 1, 0, 1), R.setTransform(a.html.navMenuLink, "translate3d(" + d * -R.scrollbarWidth + "px,0,0)")), | |
| k || (a.nav.enterContentMode(), k = !0)) | |
| }, | |
| onComplete: function() { | |
| R.onNextFrame(function() { | |
| a.setContentMode(d); | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1 | |
| }) | |
| } | |
| }) | |
| } | |
| }; | |
| this.prepareToAnimateToMasthead = function() { | |
| for (var a = this.html.pageBodyDivs[this.pageIndex].querySelectorAll(".page-section"), c = 2; c < a.length; c++) a[c].style.display = "none"; | |
| R.setTransform(this.html.siteDiv, "translate3d(0,-100%,0)"); | |
| this.html.siteDiv.style.top = ""; | |
| R.touch || (document.body.style.overflow = "hidden"); | |
| 0 < R.scrollbarWidth && (this.html.pageBodyDivs[this.pageIndex].style.paddingRight = | |
| R.scrollbarWidth + "px", R.setTransform(this.html.navMenuLink, "translate3d(" + -R.scrollbarWidth + "px,0,0)")); | |
| 0 < R.scrollbarWidth && (this.html.siteBodyDiv.style.backgroundColor = this.getBackgroundColor(), document.body.style.backgroundColor = this.getBackgroundColor()); | |
| this.ribbon.setColors(new Color(PAGE_DATA[this.pageIndex].colors.ribbonPrimary), new Color(PAGE_DATA[this.pageIndex].colors.ribbonSecondary)); | |
| R.startRendering(); | |
| this.resizeRibbon(); | |
| this.ribbonManager.attachToRenderFrame(); | |
| this.nav.hidePagination(!0); | |
| this.nav.hideBg() | |
| }; | |
| this.animateToMasthead = function() { | |
| if (!(this.animating || this.menuOpen || this.dragging)) { | |
| this.animating = !0; | |
| 0 < R.scrollbarWidth && R.setTransform(this.html.navMenuLink, "translate3d(" + -R.scrollbarWidth + "px,0,0)"); | |
| this.prepareToAnimateToMasthead(); | |
| var g = this.ribbon.getCurrentVerticalPosition(); | |
| this.ribbon.verticalPosition = g; | |
| this.ribbon.positionDamping = 1; | |
| this.ribbon.canDestruct = !1; | |
| var c = window.innerHeight, | |
| d = (c - a.navHeight) / c, | |
| k = !1, | |
| l = { | |
| value: c | |
| }; | |
| new Tween(l, 860, { | |
| value: 0, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + -l.value + "px,0)"); | |
| var f = l.value / c, | |
| g = Math.min(f, 1); | |
| a.ribbon.verticalPosition = 0.5 * (1 - g); | |
| a.ribbon.positionDamping = g; | |
| a.ribbon.straightenStrength = g; | |
| a.ribbon.straighten(); | |
| f <= d && (0 < R.scrollbarWidth && (f = R.normalize(f, d, 1, 0, 1), f = 1 - Math.min(-f, 1), R.setTransform(a.html.navMenuLink, "translate3d(" + f * -R.scrollbarWidth + "px,0,0)")), k || (a.nav.exitContentMode(), k = !0)) | |
| }, | |
| onComplete: function() { | |
| a.setContentMode(f); | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1 | |
| } | |
| }) | |
| } | |
| }; | |
| this.animateToHeaderIndex = function(f, c, d) { | |
| if (!(this.animating || this.dragging || this.menuOpen || f == this.pageIndex)) { | |
| this.animating = !0; | |
| var k = this.pageIndex; | |
| this.pageIndex = f = this.getRealIndex(f); | |
| this.setPage(f, c); | |
| d && this.updateHistory(c); | |
| this.ribbon.speed = 0; | |
| d = this.html.pageHeadDivs[f]; | |
| d.style.display = "block"; | |
| d.style.left = 100 * c + "%"; | |
| d.style.right = -100 * c + "%"; | |
| 768 > window.innerWidth && (0 == f ? this.hideDownArrow(400, 0) : this.showDownArrow(400, 400)); | |
| var l = this.getColorTransitions(k, f), | |
| n = window.innerWidth, | |
| p = 0, | |
| r = { | |
| value: 0 | |
| }; | |
| new Tween(r, 860, { | |
| value: 1, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, "translate3d(" + 100 * -r.value * c + "%,0,0)"); | |
| a.ribbon.setColors(l.primary.getColorAtValue(r.value), l.secondary.getColorAtValue(r.value)); | |
| a.ribbon.move(1.2 * (r.value - p) * c * n); | |
| p = r.value | |
| }, | |
| onComplete: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, ""); | |
| a.ribbon.speed = 0.3 * c; | |
| a.animating = !1; | |
| a.updateContent(); | |
| a.updateHeaders() | |
| } | |
| }) | |
| } | |
| }; | |
| this.getVisiblePageSectionDivs = function(a) { | |
| a = this.html.pageBodyDivs[a].querySelectorAll(".page-section"); | |
| for (var c = [], f = 0; f < a.length; f++) { | |
| var d = a[f]; | |
| R.visible(d, !0) && c.push(d) | |
| } | |
| return c | |
| }; | |
| this.animateToPageIndex = function(f, c, d) { | |
| if (!(this.animating || this.dragging || this.menuOpen || f == this.pageIndex)) { | |
| this.animating = !0; | |
| var k = this.pageIndex, | |
| l = this.getRealIndex(f); | |
| this.pageIndex = l; | |
| this.setPage(l, c); | |
| d && this.updateHistory(c); | |
| f = this.getBackgroundColor(l); | |
| d = this.getPrimaryColor(l); | |
| this.html.siteBodyDiv.style.backgroundColor = f; | |
| this.nav.setBackgroundColor(d); | |
| var n = a.getVisiblePageSectionDivs(k); | |
| for (f = 0; f < n.length; f++) d = | |
| n[f], R.setTransition(d, "transform 860ms ease-in-out"), R.setTransform(d, "translate3d(" + 100 * -c + "%,0,0)"); | |
| R.setTransition(a.html.navBarBgDiv, "transform 860ms ease-in-out"); | |
| R.setTransform(a.html.navBarBgDiv, "translate3d(" + 100 * -c + "%,0,0)"); | |
| R.onTransitionEnd(a.html.navBarBgDiv, function() { | |
| a.html.pageBodyDivs[k].style.display = "none"; | |
| for (var f = 0; f < n.length; f++) { | |
| var d = n[f]; | |
| R.setTransition(d, ""); | |
| R.setTransform(d, "") | |
| } | |
| a.showPageContent(l, c) | |
| }) | |
| } | |
| }; | |
| this.showPageContent = function(f, c) { | |
| var d = a.html.pageBodyDivs[a.pageIndex]; | |
| d.style.display = "block"; | |
| 0 < R.scrollbarWidth && (d.style.paddingRight = ""); | |
| for (var k = d.querySelectorAll(".page-section"), l = Array.prototype.slice.call(k, 0, 2), d = 0; d < l.length; d++) { | |
| var n = l[d]; | |
| n.style.display = ""; | |
| R.setTransform(n, "translate3d(" + 90 * c + "px,0,0)"); | |
| n.style.opacity = "0" | |
| } | |
| R.onNextFrame(function() { | |
| window.scrollTo(0, R.touch ? 1 : 0); | |
| for (var c = 0; c < l.length; c++) { | |
| var f = l[c]; | |
| R.setTransition(f, "opacity .4s linear, transform .4s ease-out"); | |
| R.setTransform(f, "translate3d(0,0,0)"); | |
| f.style.opacity = "1" | |
| } | |
| R.onTransitionEnd(l[0], | |
| function() { | |
| for (var c = 0; c < l.length; c++) { | |
| var f = l[c]; | |
| R.setTransition(f, ""); | |
| R.setTransform(f, "") | |
| } | |
| R.onNextFrame(function() { | |
| for (var c = 0; c < k.length; c++) k[c].style.display = ""; | |
| a.nav.setForegroundColor(a.getPrimaryColor()); | |
| a.nav.setBackgroundColor(""); | |
| R.setTransition(a.html.navBarBgDiv, ""); | |
| R.setTransform(a.html.navBarBgDiv, ""); | |
| a.updateHeaders(); | |
| a.animating = !1; | |
| a.activateIcons(); | |
| a.activateSlideshows(); | |
| a.activateCodeSnippets(); | |
| a.activateVideoPlayers(); | |
| a.loadCurrentDribbleShots(); | |
| R.onNextFrame(function() { | |
| a.updateImages() | |
| }) | |
| }) | |
| }) | |
| }) | |
| }; | |
| this.setPage = function(a, c, f, d) { | |
| f = this.contentMode == R.Site.CONTENT_MODE_MASTHEAD; | |
| this.headerPagination.setPage(a, f); | |
| this.navPagination.setPage(a, !f); | |
| this.badge.setPage(a, c, f, d); | |
| this.currentFooter = this.html.pageBodyDivs[this.pageIndex].getElementsByTagName("footer")[0] | |
| }; | |
| this.showAllPageSections = function(a) { | |
| a = this.html.pageBodyDivs[a].querySelectorAll(".page-section"); | |
| for (var c = 0; c < a.length; c++) a[c].style.display = "" | |
| }; | |
| this.setContentMode = function(g) { | |
| switch (g) { | |
| case d: | |
| this.animating = !0; | |
| R.touch || (document.body.style.overflow = | |
| ""); | |
| 0 < R.scrollbarWidth && (R.setTransform(a.html.navMenuLink, ""), a.html.pageBodyDivs[a.pageIndex].style.paddingRight = ""); | |
| this.nav.showBg(); | |
| this.nav.showPagination(); | |
| 0 < R.scrollbarWidth && this.nav.resize(); | |
| R.stopRendering(); | |
| a.ribbon.setPullPoint(0.5); | |
| a.ribbon.clearCanvas(); | |
| a.ribbonManager.detachFromRenderFrame(); | |
| R.onNextFrame(function() { | |
| a.activateIcons(); | |
| a.activateSlideshows(); | |
| a.activateCodeSnippets(); | |
| a.activateVideoPlayers(); | |
| a.loadCurrentDribbleShots(); | |
| a.updateImages(); | |
| R.setTransform(a.html.siteDiv, ""); | |
| a.html.siteDiv.style.top = "-100%"; | |
| R.onNextFrame(function() { | |
| a.showAllPageSections(a.pageIndex); | |
| a.animating = !1 | |
| }) | |
| }); | |
| this.contentMode = d; | |
| break; | |
| case f: | |
| R.touch || (document.body.style.overflow = "hidden"), R.setTransform(this.html.siteDiv, ""), this.nav.resize(), R.redrawElement(this.html.siteNavDiv), this.contentMode = f | |
| } | |
| }; | |
| this.badgeNextClick = function() { | |
| this.animating || this.dragging || this.menuOpen || this.animateToHeaderIndex(this.pageIndex + 1, 1, !0) | |
| }; | |
| this.badgeBackClick = function() { | |
| this.animating || this.dragging || this.menuOpen || | |
| this.animateToHeaderIndex(this.pageIndex - 1, -1, !0) | |
| }; | |
| this.paginationClick = function(a) { | |
| if (!(this.animating || this.dragging || this.menuOpen)) { | |
| var c = a > this.pageIndex ? 1 : -1; | |
| this.contentMode == f ? this.animateToHeaderIndex(a, c, !0) : this.animateToPageIndex(a, c, !0) | |
| } | |
| }; | |
| this.navLogoClick = function() { | |
| if (this.contentMode == d) { | |
| if (2 > window.pageYOffset) { | |
| window.scrollTo(0, 0); | |
| a.animateToMasthead(); | |
| return | |
| } | |
| R.startRendering(); | |
| this.animating = !0; | |
| var f = { | |
| value: window.pageYOffset | |
| }; | |
| new Tween(f, 460, { | |
| value: 0, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| window.scrollTo(0, | |
| f.value) | |
| }, | |
| onComplete: function() { | |
| setTimeout(function() { | |
| a.animating = !1; | |
| a.animateToMasthead() | |
| }, 36) | |
| } | |
| }) | |
| } | |
| return !1 | |
| }; | |
| this.navArrowClick = function() {}; | |
| this.getColorTransitions = function(a, c) { | |
| a = this.getRealIndex(a); | |
| var f = this.getRealIndex(c); | |
| return { | |
| primary: new ColorTransition(new Color(PAGE_DATA[a].colors.ribbonPrimary), new Color(PAGE_DATA[f].colors.ribbonPrimary)), | |
| secondary: new ColorTransition(new Color(PAGE_DATA[a].colors.ribbonSecondary), new Color(PAGE_DATA[f].colors.ribbonSecondary)) | |
| } | |
| } | |
| }; | |
| R.Site.CONTENT_MODE_CONTENT = 1; | |
| R.Site.CONTENT_MODE_MASTHEAD = 0; | |
| R.Site.prototype.menuLinkClick = function(a) { | |
| if (!this.animating) { | |
| var d = this.getPageIndexForPath(a.pathname); | |
| if (-1 == d) return !0; | |
| var f = this, | |
| g = d > this.pageIndex ? 1 : -1; | |
| this.contentMode == R.Site.CONTENT_MODE_MASTHEAD ? (this.nav.menuWillClose(), this.nav.closeMenu(function() { | |
| f.menuOpen = !1; | |
| R.startRendering(); | |
| f.ribbonManager.attachToRenderFrame(); | |
| f.nav.setBackgroundColor(""); | |
| f.ribbon.clearCanvas(); | |
| d != f.pageIndex && f.animateToHeaderIndex(d, g, !0); | |
| var a = window.innerHeight, | |
| h = !1, | |
| k = { | |
| val: 1 | |
| }; | |
| new Tween(k, 860, { | |
| val: 0, | |
| ease: Ease.easeOut.sine, | |
| onUpdate: function() { | |
| !h && k.val * a > f.navHeight && (f.nav.useDarkIcons(), h = !0); | |
| f.ribbon.verticalPosition = 0.5 * (1 - k.val); | |
| f.ribbon.positionDamping = k.val; | |
| f.ribbon.straightenStrength = k.val; | |
| f.ribbon.straighten() | |
| }, | |
| onComplete: function() {} | |
| }) | |
| })) : (this.nav.menuWillClose(), this.nav.closeMenu(function() { | |
| f.menuOpen = !1; | |
| d != f.pageIndex && f.animateToPageIndex(d, g, !0) | |
| })); | |
| return !1 | |
| } | |
| }; | |
| R.Site.prototype.menuClick = function() { | |
| if (!this.animating) { | |
| this.animating = !0; | |
| var a = this; | |
| this.menuOpen ? (this.nav.menuWillClose(), this.nav.closeMenu(function() { | |
| a.menuClosed() | |
| })) : (this.contentMode == R.Site.CONTENT_MODE_MASTHEAD ? this.animateRibbonToTop(function() { | |
| R.stopRendering(); | |
| a.ribbonManager.detachFromRenderFrame(); | |
| a.nav.setBackgroundColor(a.getPrimaryColor()); | |
| a.ribbon.clearCanvas(); | |
| a.nav.openMenu(function() { | |
| a.menuOpened() | |
| }) | |
| }) : (R.stopRendering(), this.ribbonManager.detachFromRenderFrame(), this.nav.openMenu(function() { | |
| a.menuOpened() | |
| })), | |
| this.nav.menuWillOpen(), this.menuOpen = !0) | |
| } | |
| }; | |
| R.Site.prototype.menuOpened = function() { | |
| this.dragging = !1; | |
| this.dragHelper.stop(); | |
| this.animating = !1 | |
| }; | |
| R.Site.prototype.menuClosed = function() { | |
| var a = this; | |
| this.contentMode == R.Site.CONTENT_MODE_MASTHEAD ? (R.startRendering(), this.ribbonManager.attachToRenderFrame(), a.nav.setBackgroundColor(""), this.animateRibbonToCenter(function() { | |
| a.animating = !1; | |
| a.menuOpen = !1 | |
| })) : this.menuOpen = this.animating = !1 | |
| }; | |
| R.Site.prototype.animateRibbonToCenter = function(a) { | |
| this.ribbon.canDestruct = !1; | |
| this.animating = !0; | |
| var d = this, | |
| f = window.innerHeight, | |
| g = !1, | |
| c = { | |
| val: 1 | |
| }; | |
| new Tween(c, 400, { | |
| val: 0, | |
| onUpdate: function() { | |
| var a = c.val; | |
| !g && a * f > d.navHeight && (d.nav.useDarkIcons(), g = !0); | |
| a = Math.min(a, 1); | |
| d.ribbon.verticalPosition = 0.5 * (1 - a); | |
| d.ribbon.positionDamping = a; | |
| d.ribbon.straightenStrength = a; | |
| d.ribbon.straighten() | |
| }, | |
| onComplete: function() { | |
| d.ribbon.canDestruct = !0; | |
| d.animating = !1; | |
| a && a() | |
| } | |
| }) | |
| }; | |
| R.Site.prototype.animateRibbonToTop = function(a) { | |
| this.ribbon.canDestruct = !1; | |
| this.animating = !0; | |
| var d = this, | |
| f = window.innerHeight, | |
| g = !1, | |
| c = { | |
| val: 0 | |
| }; | |
| new Tween(c, 400, { | |
| val: 1, | |
| onUpdate: function() { | |
| var a = c.val; | |
| !g && (1 - a) * f < d.navHeight && (d.nav.useLightIcons(), g = !0); | |
| a = Math.min(a, 1); | |
| d.ribbon.verticalPosition = 0.5 * (1 - a); | |
| d.ribbon.positionDamping = a; | |
| d.ribbon.straightenStrength = a; | |
| d.ribbon.straighten() | |
| }, | |
| onComplete: function() { | |
| d.ribbon.canDestruct = !0; | |
| d.animating = !1; | |
| a && a() | |
| } | |
| }) | |
| }; | |
| R.Site.prototype.findInternalLinks = function() { | |
| for (var a = document.getElementsByClassName("internal-link"), d = this, f = a.length - 1; 0 <= f; f--) a[f].onclick = function() { | |
| return d.internalLinkClick(this) | |
| } | |
| }; | |
| R.Site.prototype.internalLinkClick = function(a) { | |
| a = this.getPageIndexForPath(a.pathname); | |
| if (-1 == a) return !0; | |
| var d = a > this.pageIndex ? 1 : -1; | |
| a != this.pageIndex && this.animateToPageIndex(a, d, !0); | |
| return !1 | |
| }; | |
| R.Site.historyCount = 0; | |
| R.Site.historyState = null; | |
| R.Site.historyDirInit = 0; | |
| R.Site.prototype.getPageIndexForPath = function(a) { | |
| for (var d = 0; d < PAGE_DATA.length; d++) | |
| if (a == PAGE_DATA[d].path) return d; | |
| return -1 | |
| }; | |
| R.Site.prototype.onPopState = function(a) { | |
| if (a.state) { | |
| var d = this.getPageIndexForPath(window.location.pathname), | |
| f; | |
| a.state.count < R.Site.historyCount ? (f = -R.Site.historyState.dir) || (f = -R.Site.historyDirInit) : f = a.state.dir; | |
| this.contentMode == R.Site.CONTENT_MODE_CONTENT ? this.animateToPageIndex(d, f, !1) : this.animateToHeaderIndex(d, f, !1); | |
| R.Site.historyDirInit || (R.Site.historyDirInit = f); | |
| a.state.dir || (R.Site.historyDirInit = 0); | |
| R.Site.historyState = a.state; | |
| R.Site.historyCount = a.state.count; | |
| this.nav.updateMenuStatus() | |
| } | |
| }; | |
| R.Site.prototype.updateHistory = function(a) { | |
| R.Site.historyDirInit || (R.Site.historyDirInit = a); | |
| var d = PAGE_DATA[this.pageIndex]; | |
| a = { | |
| dir: a, | |
| count: ++R.Site.historyCount | |
| }; | |
| window.history.pushState(a, d.title, d.path); | |
| R.Site.historyState = a; | |
| this.nav.updateMenuStatus() | |
| }; | |
| R.Site.prototype.enableDragging = function() { | |
| var a = this, | |
| d = function(f) { | |
| if (a.dragging || a.animating) return !1; | |
| if (a.menuOpen) return !0; | |
| a.dragging = !0; | |
| a.dragHelper.start(f); | |
| a.dragHelper.onIntentClear = a.dragIntentClear.bind(a); | |
| a.dragHelper.onDrag = function(f, c, d, k, l, n) { | |
| return a.contentMode == R.Site.CONTENT_MODE_MASTHEAD || 0 < n && 0 == window.pageYOffset ? !1 : !0 | |
| }; | |
| a.dragHelper.onComplete = function() { | |
| a.dragging = !1 | |
| } | |
| }; | |
| R.touch ? window.ontouchstart = d : document.body.onmousedown = d | |
| }; | |
| R.Site.prototype.dragIntentClear = function(a, d, f, g, c, h, k) { | |
| this.dragHelper.onComplete = void 0; | |
| a == DragHelper.DRAG_DIRECTION_X ? this.startHorizontalDrag(h) : this.startVerticalDrag(k) | |
| }; | |
| R.Site.prototype.startVerticalDrag = function(a) { | |
| this.contentMode == R.Site.CONTENT_MODE_MASTHEAD ? this.startVerticalDragMasthead() : 0 < a && 0 == window.pageYOffset ? this.startVerticalDragContent() : (this.dragHelper.onIntentClear = void 0, this.dragHelper.onComplete = void 0, this.dragHelper.onDrag = void 0, this.dragHelper.stop(), this.dragging = !1) | |
| }; | |
| R.Site.prototype.startVerticalDragContent = function() { | |
| var a = this; | |
| this.prepareToAnimateToMasthead(); | |
| var d = this.ribbon.getCurrentVerticalPosition(); | |
| this.ribbon.verticalPosition = d; | |
| this.ribbon.positionDamping = 1; | |
| this.ribbon.canDestruct = !1; | |
| this.ribbon.speed = 0; | |
| var f = window.innerHeight, | |
| g = !0, | |
| c = 0; | |
| this.dragHelper.onDrag = function(d, k, l, n, p, r) { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + (-f + k) + "px,0)"); | |
| a.ribbonDragVertical(1 - k / f, 0.5, 0); | |
| g && 0 > k / f ? (g = !1, a.nav.showBg()) : !g && 0 < k / f && (g = !0, a.nav.hideBg()); | |
| c = k; | |
| return !1 | |
| }; | |
| this.dragHelper.onComplete = function(d, g) { | |
| a.dragHelper.onIntentClear = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onDrag = void 0; | |
| a.dragging = !1; | |
| a.animating = !0; | |
| var l; | |
| switch (g) { | |
| case DragHelper.OUTCOME_CLICK: | |
| case DragHelper.OUTCOME_NEXT: | |
| case DragHelper.OUTCOME_NONE: | |
| l = !1; | |
| break; | |
| case DragHelper.OUTCOME_BACK: | |
| l = !0 | |
| } | |
| var n = { | |
| value: -f + c | |
| }; | |
| l ? new Tween(n, 460, { | |
| value: 0, | |
| percent: 1, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + n.value + "px,0)"); | |
| a.ribbonDragVertical(-n.value / | |
| f, 0.5, 0, !0) | |
| }, | |
| onComplete: function() { | |
| a.setContentMode(R.Site.CONTENT_MODE_MASTHEAD); | |
| a.ribbon.speed = 0.5 < Math.random() ? -0.3 : 0.3; | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1 | |
| } | |
| }) : new Tween(n, 460, { | |
| value: -window.innerHeight, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + n.value + "px,0)"); | |
| a.ribbonDragVertical(-n.value / f, 0.5, 0) | |
| }, | |
| onComplete: function() { | |
| a.setContentMode(R.Site.CONTENT_MODE_CONTENT); | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1 | |
| } | |
| }) | |
| } | |
| }; | |
| R.Site.prototype.startVerticalDragMasthead = function() { | |
| var a = this, | |
| d = window.innerHeight, | |
| f = 0, | |
| g = this.ribbon.getCurrentVerticalPosition(); | |
| this.ribbon.verticalPosition = g; | |
| this.ribbon.positionDamping = 1; | |
| this.ribbon.canDestruct = !1; | |
| this.ribbon.speed = 0; | |
| this.dragHelper.onDrag = function(c, h, k, l, n, p) { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + h + "px,0)"); | |
| a.ribbonDragVertical(-h / d, g, 0, !1); | |
| f = h; | |
| return !1 | |
| }; | |
| this.dragHelper.onComplete = function(c, h) { | |
| a.dragHelper.onIntentClear = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onDrag = | |
| void 0; | |
| a.dragging = !1; | |
| a.animating = !0; | |
| var k; | |
| switch (h) { | |
| case DragHelper.OUTCOME_CLICK: | |
| case DragHelper.OUTCOME_BACK: | |
| case DragHelper.OUTCOME_NONE: | |
| k = !1; | |
| break; | |
| case DragHelper.OUTCOME_NEXT: | |
| k = !0 | |
| } | |
| var l = { | |
| value: f | |
| }; | |
| k ? new Tween(l, 460, { | |
| value: -window.innerHeight, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + l.value + "px,0)"); | |
| a.ribbonDragVertical(-l.value / d, g, 0) | |
| }, | |
| onComplete: function() { | |
| R.onNextFrame(function() { | |
| a.setContentMode(R.Site.CONTENT_MODE_CONTENT); | |
| a.ribbon.canDestruct = !1; | |
| a.animating = !1 | |
| }) | |
| } | |
| }) : new Tween(l, 460, { | |
| value: 0, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteDiv, "translate3d(0," + l.value + "px,0)"); | |
| a.ribbonDragVertical(-l.value / d, g, 0, !0) | |
| }, | |
| onComplete: function() { | |
| R.setTransform(a.html.siteDiv, ""); | |
| a.ribbon.speed = 0.5 < Math.random() ? -0.3 : 0.3; | |
| a.ribbon.canDestruct = !1; | |
| a.animating = !1 | |
| } | |
| }) | |
| } | |
| }; | |
| R.Site.prototype.ribbonDragVertical = function(a, d, f, g) { | |
| var c = window.innerHeight, | |
| h = (c - this.navHeight) / c, | |
| c = R.normalize(a, 0, h, 0, 1), | |
| c = Math.min(c, 1); | |
| a < h && this.nav.contentMode ? this.nav.exitContentMode() : a > h && !this.nav.contentMode && this.nav.enterContentMode(); | |
| 0 < R.scrollbarWidth && (h = R.normalize(a, h, 1, 0, 1), h = Math.max(h, 0), h = Math.min(h, 1), R.setTransform(this.html.navMenuLink, "translate3d(" + h * -R.scrollbarWidth + "px,0,0)")); | |
| this.ribbon.straightenStrength = c; | |
| this.ribbon.verticalPosition = (f - d) * a / 1 + d; | |
| g && (this.ribbon.positionDamping = | |
| a); | |
| this.ribbon.straighten() | |
| }; | |
| R.Site.prototype.startHorizontalDrag = function(a) { | |
| this.contentMode == R.Site.CONTENT_MODE_MASTHEAD ? this.startHorizontalDragMasthead() : this.startHorizontalDragContent() | |
| }; | |
| R.Site.prototype.ribbonDragHorizontal = function(a, d) { | |
| var f = 0 < a ? 0 : 1, | |
| g = Math.abs(a); | |
| this.ribbon.setPullPoint(f); | |
| this.ribbon.pullStrength = 0.5 * g; | |
| this.ribbon.straighten(); | |
| this.ribbon.move(d) | |
| }; | |
| R.Site.prototype.startHorizontalDragMasthead = function() { | |
| var a = this, | |
| d = this.getRealIndex(this.pageIndex - 1), | |
| f = this.getRealIndex(this.pageIndex + 1), | |
| g = this.html.pageHeadDivs[f], | |
| c = this.html.pageHeadDivs[d]; | |
| g.style.display = "block"; | |
| g.style.right = "-100%"; | |
| g.style.left = "100%"; | |
| c.style.display = "block"; | |
| c.style.right = "100%"; | |
| c.style.left = "-100%"; | |
| this.colorTransitionNext = this.getColorTransitions(this.pageIndex, f); | |
| this.colorTransitionPrev = this.getColorTransitions(this.pageIndex, d); | |
| this.ribbon.canDestruct = !1; | |
| var h = window.innerWidth, | |
| k = 0; | |
| this.dragHelper.onDrag = function(c, f, d, g, q, s) { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, "translate3d(" + c + "px,0,0)"); | |
| f = -c / h; | |
| a.ribbon.pullStrength = 0.5 * Math.abs(f); | |
| a.ribbonDragHorizontal(f, c - k); | |
| a.adjustDownArrowOpacity(f); | |
| k = c; | |
| return !1 | |
| }; | |
| this.adjustDownArrowOpacity = function(c) { | |
| 768 < window.innerWidth || (0 == a.pageIndex % 4 ? (c = Math.abs(c), a.html.siteHeadDownArrowLink.style.opacity = c) : 0 == (a.pageIndex + 1) % 4 ? 0 < c && (c = R.normalize(c, 0, 0.5, 1, 0), a.html.siteHeadDownArrowLink.style.opacity = Math.max(c, 0)) : 0 == (a.pageIndex - | |
| 1) % 4 && 0 > c && (c = R.normalize(c, 0, -0.5, 1, 0), a.html.siteHeadDownArrowLink.style.opacity = Math.max(c, 0))) | |
| }; | |
| this.dragHelper.onComplete = function(c, f) { | |
| a.dragHelper.onIntentClear = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onDrag = void 0; | |
| a.dragging = !1; | |
| a.animating = !0; | |
| var d = a.pageIndex, | |
| g = 0; | |
| switch (c) { | |
| case DragHelper.OUTCOME_NEXT: | |
| d += 1; | |
| g = 1; | |
| break; | |
| case DragHelper.OUTCOME_BACK: | |
| d -= 1, g = -1 | |
| } | |
| d = a.getRealIndex(d); | |
| 768 > window.innerWidth && (0 == d ? a.hideDownArrow(400, 0) : a.showDownArrow(400, 0)); | |
| var q = { | |
| value: k, | |
| percent: 0 | |
| }, | |
| s = | |
| a.ribbon.pullStrength; | |
| a.pageIndex != d ? (a.pageIndex = d, a.setPage(d, g, !0, !0), a.updateHistory(g), new Tween(q, 460, { | |
| value: h * -g, | |
| percent: 1, | |
| ease: Ease.easeOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, "translate3d(" + q.value + "px,0,0)"); | |
| var c = -q.value / h; | |
| a.ribbon.pullStrength = s - s * q.percent; | |
| a.ribbonDragHorizontal(c, q.value - k); | |
| k = q.value | |
| }, | |
| onComplete: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, ""); | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1; | |
| a.updateContent(); | |
| a.updateHeaders(); | |
| a.ribbon.setPullPoint(0.5); | |
| g && (a.ribbon.speed = 0.3 * g) | |
| } | |
| })) : new Tween(q, 460, { | |
| value: 0, | |
| percent: 1, | |
| ease: Ease.easeOut.sine, | |
| onUpdate: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, "translate3d(" + q.value + "px,0,0)"); | |
| var c = -q.value / h; | |
| a.ribbon.pullStrength = s - s * q.percent; | |
| a.ribbonDragHorizontal(c, q.value - k); | |
| k = q.value | |
| }, | |
| onComplete: function() { | |
| R.setTransform(a.html.siteHeadPageAreaDiv, ""); | |
| a.ribbon.canDestruct = !0; | |
| a.animating = !1; | |
| a.updateHeaders(); | |
| a.ribbon.setPullPoint(0.5); | |
| g && (a.ribbon.speed = 0.3 * g) | |
| } | |
| }) | |
| } | |
| }; | |
| R.Site.prototype.startHorizontalDragContent = function() { | |
| var a = this, | |
| d = 0, | |
| f = this.getVisiblePageSectionDivs(this.pageIndex); | |
| this.dragHelper.onDrag = function(g, c, h, k, l, n) { | |
| 0 < g && 0 >= d ? (c = a.getBackgroundColor(a.pageIndex - 1), h = a.getPrimaryColor(a.pageIndex - 1), a.html.siteBodyDiv.style.backgroundColor = c, a.nav.setBackgroundColor(h)) : 0 > g && 0 <= d && (c = a.getBackgroundColor(a.pageIndex + 1), h = a.getPrimaryColor(a.pageIndex + 1), a.html.siteBodyDiv.style.backgroundColor = c, a.nav.setBackgroundColor(h)); | |
| R.setTransform(a.html.navBarBgDiv, | |
| "translate3d(" + g + "px,0,0)"); | |
| for (c = 0; c < f.length; c++) R.setTransform(f[c], "translate3d(" + g + "px,0,0)"); | |
| d = g; | |
| return !1 | |
| }; | |
| this.dragHelper.onComplete = function(d, c) { | |
| a.dragHelper.onIntentClear = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onDrag = void 0; | |
| a.dragging = !1; | |
| a.animating = !0; | |
| var h = a.pageIndex, | |
| k = a.pageIndex, | |
| l; | |
| switch (d) { | |
| case DragHelper.OUTCOME_NEXT: | |
| k += 1; | |
| l = 1; | |
| break; | |
| case DragHelper.OUTCOME_BACK: | |
| k -= 1, l = -1 | |
| } | |
| k = a.getRealIndex(k); | |
| if (h != k) { | |
| var n = 460; | |
| a.pageIndex = k; | |
| a.setPage(k, l, !0, !0); | |
| a.updateHistory(l); | |
| for (var p = | |
| 0; p < f.length; p++) { | |
| var r = f[p]; | |
| R.setTransition(r, "transform " + n + "ms ease-out"); | |
| R.setTransform(r, "translate3d(" + 100 * -l + "%,0,0)") | |
| } | |
| R.setTransition(a.html.navBarBgDiv, "transform " + n + "ms ease-out"); | |
| R.setTransform(a.html.navBarBgDiv, "translate3d(" + 100 * -l + "%,0,0)"); | |
| R.onTransitionEnd(a.html.navBarBgDiv, function() { | |
| a.html.pageBodyDivs[h].style.display = "none"; | |
| for (var c = 0; c < f.length; c++) { | |
| var d = f[c]; | |
| R.setTransition(d, ""); | |
| R.setTransform(d, "") | |
| } | |
| a.showPageContent(k, l) | |
| }) | |
| } else { | |
| n = 460; | |
| for (p = 0; p < f.length; p++) r = f[p], R.setTransition(r, | |
| "transform " + n + "ms ease-out"), R.setTransform(r, "translate3d(0,0,0)"); | |
| R.setTransition(a.html.navBarBgDiv, "transform " + n + "ms ease-out"); | |
| R.setTransform(a.html.navBarBgDiv, "translate3d(0,0,0)"); | |
| R.onTransitionEnd(a.html.navBarBgDiv, function() { | |
| for (var c = 0; c < f.length; c++) { | |
| var d = f[c]; | |
| R.setTransition(d, ""); | |
| R.setTransform(d, "") | |
| } | |
| R.setTransition(a.html.navBarBgDiv, ""); | |
| R.setTransform(a.html.navBarBgDiv, ""); | |
| a.nav.setBackgroundColor(""); | |
| a.animating = !1 | |
| }) | |
| } | |
| } | |
| }; | |
| R.Site.prototype.ribbonDragHorizontal = function(a, d) { | |
| var f = Math.abs(a), | |
| f = Math.min(1, f), | |
| g, c; | |
| 0 < a ? (g = 0, c = this.colorTransitionNext) : (g = 1, c = this.colorTransitionPrev); | |
| c && this.ribbon.setColors(c.primary.getColorAtValue(f), c.secondary.getColorAtValue(f)); | |
| this.ribbon.setPullPoint(g); | |
| this.ribbon.straighten(); | |
| this.ribbon.move(1.2 * -d) | |
| }; | |
| R.Site.prototype.setupDribbbleShots = function() { | |
| for (var a = PAGE_DATA.length - 1; 0 <= a; a--) PAGE_DATA[a].dribbbleProject && (this.dribbbleShots[a] = new DribbbleShots(this.html.pageContentDivs[a].getElementsByClassName("dribbble-shots-inner")[0], PAGE_DATA[a].dribbbleProject, PAGE_DATA[a].colors.dribbble, PAGE_DATA[a].colors.dribbbleCTA, R.scale)) | |
| }; | |
| R.Site.prototype.loadCurrentDribbleShots = function() { | |
| this.dribbbleShots[this.pageIndex] && this.dribbbleShots[this.pageIndex].load() | |
| }; | |
| R.Site.prototype.onMouseWheel = function(a) { | |
| var d = a.wheelDeltaX || -a.deltaX, | |
| f = a.wheelDeltaY || -a.deltaY, | |
| g = Math.abs(d), | |
| c = Math.abs(f); | |
| this.clearMouseWheelSuspension(); | |
| if (0 > this.mouseWheelLastY && f < this.mouseWheelLastY || 0 < this.mouseWheelLastY && f > this.mouseWheelLastY) clearTimeout(this.mouseWheelTimeout), this.mouseWheelSuspended = !1; | |
| if (0 > this.mouseWheelLastX && d < this.mouseWheelLastX || 0 < this.mouseWheelLastX && d > this.mouseWheelLastX) clearTimeout(this.mouseWheelTimeout), this.mouseWheelSuspended = !1; | |
| if (0 < f && 0 > this.mouseWheelLastY || | |
| 0 > f && 0 < this.mouseWheelLastY) clearTimeout(this.mouseWheelTimeout), this.mouseWheelSuspended = !1; | |
| if (0 < d && 0 > this.mouseWheelLastX || 0 > d && 0 < this.mouseWheelLastX) clearTimeout(this.mouseWheelTimeout), this.mouseWheelSuspended = !1; | |
| this.mouseWheelLastX = d; | |
| this.mouseWheelLastY = f; | |
| 0 >= window.pageYOffset && 0 < f && a.preventDefault(); | |
| if (this.animating || this.mouseWheelSuspended) return !0; - 50 > d && g > c || 50 < d && g > c || (0 > f && c > g && this.contentMode == R.Site.CONTENT_MODE_MASTHEAD && 0 >= window.pageYOffset ? (this.animateToContent(), this.mouseWheelSuspended = !0, this.mouseWheelSpeed = 0) : 0 < f && c > g && this.contentMode == R.Site.CONTENT_MODE_CONTENT && 0 >= window.pageYOffset && (this.animateToMasthead(), this.mouseWheelSuspended = !0, this.mouseWheelSpeed = 0)); | |
| this.mouseWheelSuspended && this.clearMouseWheelSuspension() | |
| }; | |
| R.Site.prototype.clearMouseWheelSuspension = function() { | |
| var a = this; | |
| clearTimeout(this.mouseWheelTimeout); | |
| this.mouseWheelTimeout = setTimeout(function() { | |
| a.mouseWheelSuspended = !1; | |
| a.mouseWheelSpeed = 0 | |
| }, 60) | |
| }; | |
| R.Site.prototype.onKeyDown = function(a) { | |
| if (!this.animating) | |
| if (38 == a.keyCode && this.contentMode == R.Site.CONTENT_MODE_CONTENT && 0 == window.pageYOffset) this.animateToMasthead(); | |
| else if (40 == a.keyCode && this.contentMode == R.Site.CONTENT_MODE_MASTHEAD && 0 == window.pageYOffset) this.animateToContent(); | |
| else if (39 == a.keyCode && this.pagesLoaded) switch (this.contentMode) { | |
| case R.Site.CONTENT_MODE_CONTENT: | |
| this.animateToPageIndex(this.pageIndex + 1, 1, !0); | |
| break; | |
| case R.Site.CONTENT_MODE_MASTHEAD: | |
| this.animateToHeaderIndex(this.pageIndex + | |
| 1, 1, !0) | |
| } else if (37 == a.keyCode && this.pagesLoaded) switch (this.contentMode) { | |
| case R.Site.CONTENT_MODE_CONTENT: | |
| this.animateToPageIndex(this.pageIndex - 1, -1, !0); | |
| break; | |
| case R.Site.CONTENT_MODE_MASTHEAD: | |
| this.animateToHeaderIndex(this.pageIndex - 1, -1, !0) | |
| } | |
| }; | |
| R.Site.prototype.teaseNext = function() { | |
| var a = this.getSidebarWidth(); | |
| this.nav.teaseNext(a); | |
| R.setTransition(this.html.siteBodyPageAreaDiv, "transform 300ms ease-out"); | |
| R.setTransform(this.html.siteBodyPageAreaDiv, "translate3d(" + -a + "px,0,0)"); | |
| var a = this.getRealIndex(this.pageIndex + 1), | |
| d = PAGE_DATA[a].colors.ribbonPrimary; | |
| this.html.siteBgDiv.style.backgroundColor = PAGE_DATA[a].colors.primary; | |
| this.nav.setBackgroundColor(d) | |
| }; | |
| R.Site.prototype.teasePrev = function() { | |
| var a = this.getSidebarWidth(); | |
| this.nav.teasePrev(a); | |
| R.setTransition(this.html.siteBodyPageAreaDiv, "transform 300ms ease-out"); | |
| R.setTransform(this.html.siteBodyPageAreaDiv, "translate3d(" + a + "px,0,0)"); | |
| var a = this.getRealIndex(this.pageIndex - 1), | |
| d = PAGE_DATA[a].colors.ribbonPrimary || "white"; | |
| this.html.siteBgDiv.style.backgroundColor = PAGE_DATA[a].colors.primary || "white"; | |
| this.nav.setBackgroundColor(d) | |
| }; | |
| R.Site.prototype.teaseNone = function() { | |
| R.setTransition(this.html.siteBodyPageAreaDiv, "transform 300ms ease-out"); | |
| R.setTransform(this.html.siteBodyPageAreaDiv, "translate3d(0,0,0)"); | |
| this.nav.teaseNone() | |
| }; | |
| R.Site.prototype.nextMouseOver = function(a) { | |
| this.dragging || this.animating || (this.dragSuspended && (this.dragSuspended = !1), this.teaseNext()) | |
| }; | |
| R.Site.prototype.nextMouseDown = function(a) { | |
| this.dragging || this.dragSuspended || this.animating || this.dragContentStart(-this.getSidebarWidth(), a) | |
| }; | |
| R.Site.prototype.nextMouseOut = function(a) { | |
| this.dragging || this.dragSuspended || this.animating || this.teaseNone() | |
| }; | |
| R.Site.prototype.prevMouseOver = function(a) { | |
| this.dragging || this.animating || (this.dragSuspended && (this.dragSuspended = !1), this.teasePrev()) | |
| }; | |
| R.Site.prototype.prevMouseDown = function(a) { | |
| this.dragging || this.dragSuspended || this.animating || this.dragContentStart(this.getSidebarWidth(), a) | |
| }; | |
| R.Site.prototype.prevMouseOut = function(a) { | |
| this.dragging || this.dragSuspended || this.animating || this.teaseNone() | |
| }; | |
| R.Site.prototype.updateDownArrow = function() { | |
| this.downArrowTween && this.downArrowTween.stop(); | |
| var a = this.getRealIndex(this.pageIndex); | |
| 768 > window.innerWidth && 0 == a ? (this.html.siteHeadDownArrowLink.style.opacity = 0, this.html.siteHeadDownArrowLink.style.visibility = "hidden", this.downArrowShowing = !1) : (768 > window.innerWidth && 0 != a ? (this.html.siteHeadDownArrowLink.style.opacity = 1, this.html.siteHeadDownArrowLink.style.visibility = "visible") : (this.html.siteHeadDownArrowLink.style.opacity = 1, this.html.siteHeadDownArrowLink.style.visibility = | |
| ""), this.downArrowShowing = !0) | |
| }; | |
| R.Site.prototype.showDownArrow = function(a, d) { | |
| if (!this.downArrowShowing) { | |
| this.downArrowShowing = !0; | |
| this.html.siteHeadDownArrowLink.style.visibility = "visible"; | |
| var f = { | |
| val: parseFloat(this.html.siteHeadDownArrowLink.style.opacity) | |
| }, | |
| g = this; | |
| this.downArrowTween && this.downArrowTween.stop(); | |
| this.downArrowTween = new Tween(f, a, { | |
| val: 1, | |
| delay: d, | |
| onUpdate: function() { | |
| g.html.siteHeadDownArrowLink.style.opacity = f.val | |
| }, | |
| onComplete: function() {} | |
| }) | |
| } | |
| }; | |
| R.Site.prototype.hideDownArrow = function(a, d) { | |
| if (this.downArrowShowing) { | |
| this.downArrowShowing = !1; | |
| var f = { | |
| val: parseFloat(this.html.siteHeadDownArrowLink.style.opacity) | |
| }, | |
| g = this; | |
| this.downArrowTween && this.downArrowTween.stop(); | |
| this.downArrowTween = new Tween(f, 400, { | |
| val: 0, | |
| delay: d, | |
| onUpdate: function() { | |
| g.html.siteHeadDownArrowLink.style.opacity = f.val | |
| }, | |
| onComplete: function() { | |
| g.html.siteHeadDownArrowLink.style.visibility = "hidden" | |
| } | |
| }) | |
| } | |
| }; | |
| R.Site.prototype.updateImages = function() { | |
| var a = this.html.pageBodyDivs[this.pageIndex]; | |
| this.html.pageBodyImages[this.pageIndex] = a.querySelectorAll("img[data-src]"); | |
| this.html.pageBodyBgDivs[this.pageIndex] = a.querySelectorAll("div[data-src]"); | |
| for (a = 0; a < this.html.pageBodyImages.length; a++) | |
| if (a != this.pageIndex) { | |
| var d = this.html.pageBodyImages[a]; | |
| if (d) | |
| for (var f = 0; f < d.length; f++) this.unloadImage(d[f]) | |
| } | |
| for (a = 0; a < this.html.pageBodyBgDivs.length; a++) | |
| if (a != this.pageIndex && (d = this.html.pageBodyBgDivs[a])) | |
| for (f = | |
| 0; f < d.length; f++) this.unloadBgDiv(d[f]); | |
| this.loadVisibleBgDivs(); | |
| this.loadVisibleImages() | |
| }; | |
| R.Site.prototype.unloadImagesForPageIndex = function(a) {}; | |
| R.Site.prototype.loadVisibleImages = function(a) { | |
| if (a = this.html.pageBodyImages[this.pageIndex]) | |
| for (var d = 0; d < a.length; d++) { | |
| var f = a[d]; | |
| if (R.visiblePlus(f, !0)) { | |
| if (!f.loaded) { | |
| f.style.opacity = "0"; | |
| var g = f.getAttribute("data-src"), | |
| c = f.getAttribute("data-mobile-src"); | |
| 768 > window.innerWidth && c && (g = c); | |
| f.src = g; | |
| f.onload = function() { | |
| R.setTransition(this, "opacity .2s linear"); | |
| this.style.opacity = "1" | |
| }; | |
| f.loaded = !0 | |
| } | |
| } else f.loaded && !f.getAttribute("data-no-unload") && this.unloadImage(f) | |
| } | |
| }; | |
| R.Site.prototype.loadVisibleBgDivs = function(a) { | |
| if (a = this.html.pageBodyBgDivs[this.pageIndex]) | |
| for (var d = 0; d < a.length; d++) { | |
| var f = a[d]; | |
| if (R.visiblePlus(f, !0)) { | |
| if (!f.loaded) { | |
| f.style.opacity = "0"; | |
| f.image = new Image; | |
| f.image.div = f; | |
| var g = f.getAttribute("data-src"), | |
| c = f.getAttribute("data-mobile-src"); | |
| 768 > window.innerWidth && c && (g = c); | |
| f.image.src = g; | |
| f.image.onload = function() { | |
| R.setTransition(this.div, "opacity .2s linear"); | |
| this.div.style.backgroundImage = "url(" + this.src + ")"; | |
| this.div.style.opacity = "1" | |
| }; | |
| f.loaded = !0 | |
| } | |
| } else f.loaded && | |
| !f.getAttribute("data-no-unload") && this.unloadBgDiv(f) | |
| } | |
| }; | |
| R.Site.prototype.unloadImage = function(a) { | |
| R.setTransition(a, ""); | |
| a.style.opacity = "0"; | |
| a.src = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="; | |
| a.loaded = !1; | |
| a.onload = void 0 | |
| }; | |
| R.Site.prototype.unloadBgDiv = function(a) { | |
| R.setTransition(a, ""); | |
| a.style.opacity = "0"; | |
| a.style.backgroundImage = ""; | |
| a.loaded = !1; | |
| a.image && (a.image.onload = void 0, delete a.image) | |
| }; | |
| var SimplexNoise = function(a) { | |
| void 0 == a && (a = Math); | |
| this.grad3 = [ | |
| [1, 1, 0], | |
| [-1, 1, 0], | |
| [1, -1, 0], | |
| [-1, -1, 0], | |
| [1, 0, 1], | |
| [-1, 0, 1], | |
| [1, 0, -1], | |
| [-1, 0, -1], | |
| [0, 1, 1], | |
| [0, -1, 1], | |
| [0, 1, -1], | |
| [0, -1, -1] | |
| ]; | |
| this.p = []; | |
| for (var d = 0; 256 > d; d++) this.p[d] = Math.floor(256 * a.random()); | |
| this.perm = []; | |
| for (d = 0; 512 > d; d++) this.perm[d] = this.p[d & 255]; | |
| this.simplex = [ | |
| [0, 1, 2, 3], | |
| [0, 1, 3, 2], | |
| [0, 0, 0, 0], | |
| [0, 2, 3, 1], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [1, 2, 3, 0], | |
| [0, 2, 1, 3], | |
| [0, 0, 0, 0], | |
| [0, 3, 1, 2], | |
| [0, 3, 2, 1], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [1, 3, 2, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [1, 2, 0, 3], | |
| [0, 0, 0, 0], | |
| [1, 3, 0, 2], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [2, 3, 0, 1], | |
| [2, 3, 1, 0], | |
| [1, 0, 2, 3], | |
| [1, 0, 3, 2], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [2, 0, 3, 1], | |
| [0, 0, 0, 0], | |
| [2, 1, 3, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [2, 0, 1, 3], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [3, 0, 1, 2], | |
| [3, 0, 2, 1], | |
| [0, 0, 0, 0], | |
| [3, 1, 2, 0], | |
| [2, 1, 0, 3], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [0, 0, 0, 0], | |
| [3, 1, 0, 2], | |
| [0, 0, 0, 0], | |
| [3, 2, 0, 1], | |
| [3, 2, 1, 0] | |
| ] | |
| }; | |
| SimplexNoise.prototype.dot = function(a, d, f) { | |
| return a[0] * d + a[1] * f | |
| }; | |
| SimplexNoise.prototype.noise = function(a, d) { | |
| var f, g, c; | |
| c = 0.5 * (Math.sqrt(3) - 1); | |
| c *= a + d; | |
| var h = Math.floor(a + c), | |
| k = Math.floor(d + c), | |
| l = (3 - Math.sqrt(3)) / 6; | |
| c = (h + k) * l; | |
| f = a - (h - c); | |
| var n = d - (k - c), | |
| p, r; | |
| f > n ? (p = 1, r = 0) : (p = 0, r = 1); | |
| g = f - p + l; | |
| var q = n - r + l; | |
| c = f - 1 + 2 * l; | |
| var l = n - 1 + 2 * l, | |
| s = h & 255, | |
| k = k & 255, | |
| h = this.perm[s + this.perm[k]] % 12; | |
| p = this.perm[s + p + this.perm[k + r]] % 12; | |
| r = this.perm[s + 1 + this.perm[k + 1]] % 12; | |
| k = 0.5 - f * f - n * n; | |
| 0 > k ? f = 0 : (k *= k, f = k * k * this.dot(this.grad3[h], f, n)); | |
| n = 0.5 - g * g - q * q; | |
| 0 > n ? g = 0 : (n *= n, g = n * n * this.dot(this.grad3[p], g, q)); | |
| q = 0.5 - c * | |
| c - l * l; | |
| 0 > q ? c = 0 : (q *= q, c = q * q * this.dot(this.grad3[r], c, l)); | |
| return 70 * (f + g + c) | |
| }; | |
| SimplexNoise.prototype.noise3d = function(a, d, f) { | |
| var g, c, h, k = (a + d + f) * (1 / 3), | |
| l = Math.floor(a + k), | |
| n = Math.floor(d + k), | |
| p = Math.floor(f + k), | |
| k = 1 / 6; | |
| h = (l + n + p) * k; | |
| g = a - (l - h); | |
| c = d - (n - h); | |
| var r = f - (p - h), | |
| q, s, w, t, u, v; | |
| g >= c ? c >= r ? (q = 1, w = s = 0, u = t = 1, v = 0) : (g >= r ? (q = 1, w = s = 0) : (s = q = 0, w = 1), t = 1, u = 0, v = 1) : c < r ? (s = q = 0, w = 1, t = 0, v = u = 1) : g < r ? (q = 0, s = 1, t = w = 0, v = u = 1) : (q = 0, s = 1, w = 0, u = t = 1, v = 0); | |
| var z = g - q + k, | |
| C = c - s + k, | |
| D = r - w + k; | |
| h = g - t + 2 * k; | |
| a = c - u + 2 * k; | |
| var F = r - v + 2 * k; | |
| f = g - 1 + 3 * k; | |
| d = c - 1 + 3 * k; | |
| var k = r - 1 + 3 * k, | |
| l = l & 255, | |
| B = n & 255, | |
| G = p & 255, | |
| n = this.perm[l + this.perm[B + this.perm[G]]] % | |
| 12, | |
| p = this.perm[l + q + this.perm[B + s + this.perm[G + w]]] % 12; | |
| t = this.perm[l + t + this.perm[B + u + this.perm[G + v]]] % 12; | |
| l = this.perm[l + 1 + this.perm[B + 1 + this.perm[G + 1]]] % 12; | |
| u = 0.6 - g * g - c * c - r * r; | |
| 0 > u ? g = 0 : (u *= u, g = u * u * this.dot(this.grad3[n], g, c, r)); | |
| c = 0.6 - z * z - C * C - D * D; | |
| 0 > c ? c = 0 : (c *= c, c = c * c * this.dot(this.grad3[p], z, C, D)); | |
| z = 0.6 - h * h - a * a - F * F; | |
| 0 > z ? h = 0 : (z *= z, h = z * z * this.dot(this.grad3[t], h, a, F)); | |
| a = 0.6 - f * f - d * d - k * k; | |
| 0 > a ? f = 0 : (a *= a, f = a * a * this.dot(this.grad3[l], f, d, k)); | |
| return 32 * (g + c + h + f) | |
| }; | |
| var SimplexStepper = function(a) { | |
| new SimplexNoise; | |
| var d = new SimplexNoise, | |
| f = 0, | |
| g = 0, | |
| c = 1, | |
| h, k = !1; | |
| this.__construct__ = function(a) { | |
| a && (c = a) | |
| }; | |
| this.advance = function() { | |
| f++; | |
| g += 0.5 * c * (d.noise(0, f / 100) + 1); | |
| k = !1 | |
| }; | |
| this.getValue = function() { | |
| k || (h = 0.5 * (d.noise(1, g / 500) + 1), k = !0); | |
| return h | |
| }; | |
| this.__construct__(a) | |
| }; | |
| var WeightOption = { | |
| STRONGER: 1, | |
| NEUTRAL: 0, | |
| WEAKER: -1 | |
| }, | |
| WeightedRandom = function(a, d, f) { | |
| var g = this; | |
| this.power = 1; | |
| this.rightModifier = this.leftModifier = WeightOption.NEUTRAL; | |
| this.random = function() { | |
| var a = Math.random(); | |
| return g.weightedValue(a) | |
| }; | |
| this.weightedValue = function(a) { | |
| if (g.leftModifier == WeightOption.NEUTRAL) return g.rightModifier == WeightOption.NEUTRAL ? a : g.rightModifier == WeightOption.STRONGER ? 1 - Math.pow(1 - a, g.power) : 1 - Math.pow(1 - a, 1 / g.power); | |
| if (g.rightModifier == WeightOption.NEUTRAL) return g.leftModifier == | |
| WeightOption.STRONGER ? Math.pow(a, g.power) : Math.pow(a, 1 / g.power); | |
| if (0.5 > a) return a *= 2, g.leftModifier == WeightOption.STRONGER ? Math.pow(a, g.power) / 2 : Math.pow(a, 1 / g.power) / 2; | |
| a = 2 * (a - 0.5); | |
| a = 1 - a; | |
| return g.rightModifier == WeightOption.STRONGER ? (1 - Math.pow(a, g.power)) / 2 + 0.5 : (1 - Math.pow(a, 1 / g.power)) / 2 + 0.5 | |
| }; | |
| (function(a, f, d) { | |
| a && (g.power = a); | |
| f && (g.leftModifier = f); | |
| d && (g.rightModifier = d) | |
| })(a, d, f) | |
| }; | |
| var ColorMode = { | |
| RGB: 0, | |
| HSV: 1, | |
| CIELCh: 2 | |
| }, | |
| Color = function(a, d, f, g) { | |
| var c = this, | |
| h = !0, | |
| k = !0, | |
| l = !0, | |
| n = !0, | |
| p = !0, | |
| r = 0, | |
| q = 0, | |
| s = 0, | |
| w = 0, | |
| t = 0, | |
| u = 0, | |
| v = 0, | |
| z = 0, | |
| C = 0, | |
| D = 0, | |
| F = 0, | |
| B = 0, | |
| G = 0, | |
| J = 0, | |
| E = 0, | |
| M = 1, | |
| N, H, P; | |
| this.logRGB = function() { | |
| console.log({ | |
| red: c.getRed(), | |
| green: c.getGreen(), | |
| blue: c.getBlue() | |
| }) | |
| }; | |
| this.logHSV = function() { | |
| console.log({ | |
| hue: c.getHue(), | |
| saturation: c.getSaturation(), | |
| value: c.getValue() | |
| }) | |
| }; | |
| this.logCIELCh = function() { | |
| console.log({ | |
| l: c.getCIELCh_L(), | |
| c: c.getCIELCh_C(), | |
| h: c.getCIELCh_H() | |
| }) | |
| }; | |
| this.clone = function() { | |
| p && I(); | |
| return new Color(r, | |
| q, s, ColorMode.RGB) | |
| }; | |
| this.getRGBA = function() { | |
| if (p) { | |
| I(); | |
| var a = Math.round(r), | |
| c = Math.round(q), | |
| f = Math.round(s), | |
| d = Math.round(1E3 * M) / 1E3; | |
| N = "rgba(" + a + ", " + c + ", " + f + ", " + d + ")"; | |
| p = !1 | |
| } | |
| return N | |
| }; | |
| this.getHex = function() { | |
| if (n) { | |
| I(); | |
| var a = Math.round(r), | |
| c = Math.round(q), | |
| f = Math.round(s); | |
| P = a = (a << 16) + (c << 8) + f; | |
| for (a = a.toString(16); 6 > a.length;) a = "0" + a; | |
| H = "#" + a; | |
| n = !1 | |
| } | |
| return H | |
| }; | |
| this.getHexValue = function() { | |
| if (n) { | |
| I(); | |
| var a = Math.round(r), | |
| c = Math.round(q), | |
| f = Math.round(s); | |
| P = a = (a << 16) + (c << 8) + f; | |
| for (a = a.toString(16); 6 > a.length;) a = "0" + | |
| a; | |
| H = "#" + a; | |
| n = !1 | |
| } | |
| return P | |
| }; | |
| this.setHex = function(a) { | |
| I(); | |
| a = a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function(a, c, f, d) { | |
| return c + c + f + f + d + d | |
| }); | |
| a = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a); | |
| r = parseInt(a[1], 16); | |
| q = parseInt(a[2], 16); | |
| s = parseInt(a[3], 16); | |
| O() | |
| }; | |
| this.getRed = function() { | |
| I(); | |
| return r | |
| }; | |
| this.setRed = function(a) { | |
| I(); | |
| r = A(a, 0, 255); | |
| O() | |
| }; | |
| this.getGreen = function() { | |
| I(); | |
| return q | |
| }; | |
| this.setGreen = function(a) { | |
| I(); | |
| q = A(a, 0, 255); | |
| O() | |
| }; | |
| this.getBlue = function() { | |
| I(); | |
| return s | |
| }; | |
| this.setBlue = function(a) { | |
| I(); | |
| s = A(a, | |
| 0, 255); | |
| O() | |
| }; | |
| this.getAlpha = function() { | |
| return M | |
| }; | |
| this.setAlpha = function(a) { | |
| M = a; | |
| p = !0 | |
| }; | |
| this.getHue = function() { | |
| L(); | |
| return w | |
| }; | |
| this.setHue = function(a) { | |
| L(); | |
| w = A(a, 0, 360); | |
| Q() | |
| }; | |
| this.getSaturation = function() { | |
| L(); | |
| return t | |
| }; | |
| this.setSaturation = function(a) { | |
| L(); | |
| t = A(a, 0, 100); | |
| Q() | |
| }; | |
| this.getValue = function() { | |
| L(); | |
| return u | |
| }; | |
| this.setValue = function(a) { | |
| L(); | |
| u = A(a, 0, 100); | |
| Q() | |
| }; | |
| this.getCIELCh_L = function() { | |
| K(); | |
| return G | |
| }; | |
| this.setCIELCH_L = function(a) { | |
| K(); | |
| G = A(a, 0, 100); | |
| S() | |
| }; | |
| this.getCIELCh_C = function() { | |
| K(); | |
| return J | |
| }; | |
| this.setCIELCH_C = | |
| function(a) { | |
| K(); | |
| J = A(a, 0, 100); | |
| S() | |
| }; | |
| this.getCIELCh_H = function() { | |
| K(); | |
| return E | |
| }; | |
| this.setCIELCH_H = function(a) { | |
| K(); | |
| E = 360 > a ? a : a - 360; | |
| S() | |
| }; | |
| var T = function() { | |
| var a = w, | |
| c = t, | |
| f = u, | |
| d, g, h, c = c / 100, | |
| f = f / 100; | |
| if (0 == c) d = c = f; | |
| else switch (a /= 60, d = Math.floor(a), g = a - d, a = f * (1 - c), h = f * (1 - c * g), g = f * (1 - c * (1 - g)), d) { | |
| case 0: | |
| d = f; | |
| c = g; | |
| f = a; | |
| break; | |
| case 1: | |
| d = h; | |
| c = f; | |
| f = a; | |
| break; | |
| case 2: | |
| d = a; | |
| c = f; | |
| f = g; | |
| break; | |
| case 3: | |
| d = a; | |
| c = h; | |
| break; | |
| case 4: | |
| d = g; | |
| c = a; | |
| break; | |
| default: | |
| d = f, c = a, f = h | |
| } | |
| r = A(255 * d, 0, 255); | |
| q = A(255 * c, 0, 255); | |
| s = A(255 * f, 0, 255) | |
| }, | |
| U = function() { | |
| var a = r, | |
| c = q, | |
| f = s, | |
| d = Math.min(a, | |
| c, f), | |
| g = Math.max(a, c, f), | |
| d = g - d, | |
| h = g, | |
| k = g; | |
| 0 != g && (k = 100 * (d / g), h = 60 * (a == g ? (c - f) / d : c == g ? 2 + (f - a) / d : 4 + (a - c) / d), 0 > h && (h += 360)); | |
| w = h; | |
| t = k; | |
| u = 100 * (g / 255) | |
| }, | |
| V = function() { | |
| var a = r / 255, | |
| c = q / 255, | |
| f = s / 255, | |
| a = 0.04045 < a ? Math.pow((a + 0.055) / 1.055, 2.4) : a / 12.92, | |
| c = 0.04045 < c ? Math.pow((c + 0.055) / 1.055, 2.4) : c / 12.92, | |
| f = 0.04045 < f ? Math.pow((f + 0.055) / 1.055, 2.4) : f / 12.92, | |
| a = 100 * a, | |
| c = 100 * c, | |
| f = 100 * f; | |
| v = 0.4124 * a + 0.3576 * c + 0.1805 * f; | |
| z = 0.2126 * a + 0.7152 * c + 0.0722 * f; | |
| C = 0.0193 * a + 0.1192 * c + 0.9505 * f | |
| }, | |
| W = function() { | |
| var a = v / 95.047, | |
| c = z / 100, | |
| f = C / 108.883, | |
| a = 0.008856 < | |
| a ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116, | |
| c = 0.008856 < c ? Math.pow(c, 1 / 3) : 7.787 * c + 16 / 116, | |
| f = 0.008856 < f ? Math.pow(f, 1 / 3) : 7.787 * f + 16 / 116; | |
| D = 0.008856 < c ? 116 * c - 16 : 903.3 * c; | |
| F = 500 * (a - c); | |
| B = 200 * (c - f) | |
| }, | |
| X = function() { | |
| var a = Math.atan2(B, F), | |
| a = 0 < a ? 180 * (a / Math.PI) : 360 - 180 * (Math.abs(a) / Math.PI); | |
| G = D; | |
| J = Math.sqrt(Math.pow(F, 2) + Math.pow(B, 2)); | |
| E = 360 > a ? a : a - 360 | |
| }, | |
| Y = function() { | |
| var a = G, | |
| c = E * (Math.PI / 180), | |
| f = Math.cos(c) * J, | |
| c = Math.sin(c) * J; | |
| D = a; | |
| F = f; | |
| B = c | |
| }, | |
| Z = function() { | |
| var a = (D + 16) / 116, | |
| c = F / 500 + a, | |
| f = a - B / 200, | |
| a = 0.008856 < Math.pow(a, 3) ? Math.pow(a, 3) : (a - | |
| 16 / 116) / 7.787, | |
| c = 0.008856 < Math.pow(c, 3) ? Math.pow(c, 3) : (c - 16 / 116) / 7.787, | |
| f = 0.008856 < Math.pow(f, 3) ? Math.pow(f, 3) : (f - 16 / 116) / 7.787; | |
| v = 95.047 * c; | |
| z = 100 * a; | |
| C = 108.883 * f | |
| }, | |
| $ = function() { | |
| var a = v / 100, | |
| c = z / 100, | |
| f = C / 100, | |
| d = 3.2406 * a + -1.5372 * c + -0.4986 * f, | |
| g = -0.9689 * a + 1.8758 * c + 0.0415 * f, | |
| a = 0.0557 * a + -0.204 * c + 1.057 * f, | |
| d = 0.0031308 < d ? 1.055 * Math.pow(d, 1 / 2.4) - 0.055 : 12.92 * d, | |
| g = 0.0031308 < g ? 1.055 * Math.pow(g, 1 / 2.4) - 0.055 : 12.92 * g, | |
| a = 0.0031308 < a ? 1.055 * Math.pow(a, 1 / 2.4) - 0.055 : 12.92 * a; | |
| r = A(255 * d, 0, 255); | |
| q = A(255 * g, 0, 255); | |
| s = A(255 * a, 0, 255) | |
| }, | |
| I = function() { | |
| h && | |
| (k ? l || (Y(), Z(), $()) : T(), h = !1) | |
| }, | |
| L = function() { | |
| k && (h ? l || (Y(), Z(), $(), U()) : U(), k = !1) | |
| }, | |
| K = function() { | |
| l && (k ? h || (V(), W(), X()) : (T(), V(), W(), X()), l = !1) | |
| }, | |
| O = function() { | |
| p = n = l = k = !0 | |
| }, | |
| Q = function() { | |
| p = n = l = h = !0 | |
| }, | |
| S = function() { | |
| p = n = k = h = !0 | |
| }, | |
| A = function(a, c, f) { | |
| return Math.min(f, Math.max(c, a)) | |
| }; | |
| (function(a, f, d, g) { | |
| g || (g = ColorMode.RGB); | |
| "string" == typeof a ? c.setHex(a) : g == ColorMode.RGB ? (a && (r = A(a, 0, 255)), f && (q = A(f, 0, 255)), d && (s = A(d, 0, 255)), h = !1) : g == ColorMode.HSV ? (a && (w = A(a, 0, 360)), f && (t = A(f, 0, 100)), d && (u = A(d, 0, 100)), k = !1) : g == ColorMode.CIELCh && | |
| (a && (G = a), f && (J = f), d && (E = 360 > d ? d : d - 360), l = !1) | |
| })(a, d, f, g) | |
| }; | |
| var ColorTransition = function(a, d, f) { | |
| var g = [], | |
| c; | |
| this.getColorAtValue = function(a) { | |
| var f = 1 / (c + 1), | |
| d = Math.floor(a / f), | |
| n = Math.ceil(a / f); | |
| if (d == n) return a = g[d], new Color(a.getRed(), a.getGreen(), a.getBlue()); | |
| a = (a - d * f) / f; | |
| var d = g[d], | |
| p = g[n], | |
| n = d.getRed() + (p.getRed() - d.getRed()) * a, | |
| f = d.getGreen() + (p.getGreen() - d.getGreen()) * a; | |
| a = d.getBlue() + (p.getBlue() - d.getBlue()) * a; | |
| return new Color(n, f, a) | |
| }; | |
| (function(a, f, d) { | |
| a || (a = new Color); | |
| f || (f = new Color); | |
| d || (d = 5); | |
| c = d; | |
| g.push(a); | |
| d = f.getCIELCh_H(); | |
| var n = a.getCIELCh_H(), | |
| p = d - n; | |
| 180 < | |
| Math.abs(p) && (0 < p ? n += 360 : d += 360); | |
| for (var p = 1 / (c + 1), r = 0; r < c; r++) { | |
| var q = (r + 1) * p, | |
| s = a.getCIELCh_L() + (f.getCIELCh_L() - a.getCIELCh_L()) * q, | |
| w = a.getCIELCh_C() + (f.getCIELCh_C() - a.getCIELCh_C()) * q, | |
| q = new Color(s, w, n + (d - n) * q, ColorMode.CIELCh); | |
| g.push(q) | |
| } | |
| g.push(f) | |
| })(a, d, f) | |
| }; | |
| var Point2D = function(a, d) { | |
| this.x = a ? a : 0; | |
| this.y = d ? d : 0; | |
| this.rotate = function(a) { | |
| var d = this.x * Math.cos(a) - this.y * Math.sin(a); | |
| a = this.x * Math.sin(a) + this.y * Math.cos(a); | |
| this.x = d; | |
| this.y = a | |
| }; | |
| this.rotateAround = function(a, d) { | |
| d = d || { | |
| x: 0, | |
| y: 0 | |
| }; | |
| var c = Math.cos, | |
| h = Math.sin; | |
| this.x = c(a) * (this.x - d.x) - h(a) * (this.y - d.y) + d.x; | |
| this.y = h(a) * (this.x - d.x) + c(a) * (this.y - d.y) + d.y | |
| }; | |
| this.translate = function(a, d) { | |
| this.x += a; | |
| this.y += d | |
| }; | |
| this.scaleX = function(a) { | |
| this.x *= a | |
| }; | |
| this.scaleY = function(a) { | |
| this.y *= a | |
| }; | |
| this.scale = function(a) { | |
| this.x *= a; | |
| this.y *= | |
| a | |
| } | |
| }; | |
| var Point3D = function() { | |
| this.z = this.y = this.x = 0 | |
| }; | |
| var Polygon3D = function() { | |
| var a = this, | |
| d = 4; | |
| this.color = null; | |
| this.__construct__ = function() { | |
| a.points = [new Point3D, new Point3D, new Point3D, new Point3D] | |
| }; | |
| this.setVerticesLength = function(f) { | |
| for (; d < f;) a.points.push(new Point3D), d++; | |
| for (; d > f;) a.points.pop(), d-- | |
| }; | |
| this.getVerticesLength = function() { | |
| return d | |
| }; | |
| this.__construct__() | |
| }; | |
| var Flat3dSetup = function(a, d) { | |
| var f = this, | |
| g = [], | |
| c, h, k, l, n = 0; | |
| this.yOffset = 0; | |
| this.scale = 1; | |
| this.shouldClear = !0; | |
| this.__construct__ = function(a, d) { | |
| c = a; | |
| h = c.getContext("2d"); | |
| d || (d = 1); | |
| f.scale = d; | |
| k = c.clientWidth * d; | |
| l = c.clientHeight * d; | |
| Math.max(k, l); | |
| Math.tan(62.5 / 180 * Math.PI); | |
| new Point2D(k / 2, 0) | |
| }; | |
| this.addPolygonAtDepth = function(a, c) { | |
| a && (c || (c = 0), n = Math.max(n, c), g[c] || (g[c] = []), g[c].push(a)) | |
| }; | |
| this.removePolygon = function(a) { | |
| for (var c = n; 0 <= c; c--) | |
| if (g[c]) { | |
| var f = g[c].indexOf(a); - 1 != f && g[c].splice(f, 1) | |
| } | |
| }; | |
| this.clear = function() { | |
| f.shouldClear && | |
| h.clearRect(0, 0, k, l) | |
| }; | |
| this.draw = function() { | |
| f.shouldClear && h.clearRect(0, 0, k, l); | |
| for (var a = n; 0 <= a; a--) | |
| if (g[a]) | |
| for (var c = 0; c < g[a].length; c++) { | |
| var d = g[a][c], | |
| s = d.points; | |
| h.fillStyle = d.color.getRGBA(); | |
| h.beginPath(); | |
| h.moveTo(s[0].x * f.scale, s[0].y * f.scale + l / 2 - f.yOffset * f.scale); | |
| for (var d = d.getVerticesLength(), w = 1; w < d; w++) h.lineTo(s[w].x * f.scale, s[w].y * f.scale + l / 2 - f.yOffset * f.scale); | |
| h.lineTo(s[0].x * f.scale, s[0].y * f.scale + l / 2 - f.yOffset * f.scale); | |
| h.fill(); | |
| h.closePath() | |
| } | |
| }; | |
| this.resetSize = function() { | |
| k = c.clientWidth * | |
| f.scale; | |
| l = c.clientHeight * f.scale | |
| }; | |
| this.__construct__(a, d) | |
| }; | |
| var DrawStyle = { | |
| LINE: 0, | |
| CANVAS_RIBBON: 1, | |
| DOM_RIBBON: 2 | |
| }, | |
| Ribbon = function(a, d, f, g) { | |
| var c = this; | |
| c.drawStyle = DrawStyle.CANVAS_RIBBON; | |
| c.fullRibbonWidth = 136; | |
| c.collapsedRibbonWidth = 70; | |
| c.width = c.fullRibbonWidth; | |
| c.pullStrength = 0; | |
| c.pullSpread = 0; | |
| c.drivePoint = 0.5; | |
| c.straightenStrength = 0; | |
| c.verticalPosition = 0.5; | |
| c.positionDamping = 0; | |
| c.canDestruct = !0; | |
| c.idleSpeed = 0.3; | |
| c.speed = c.idleSpeed; | |
| var h, k, l = {}, | |
| n = null, | |
| p = null, | |
| r = 0, | |
| q = 1, | |
| s = null, | |
| w = 0; | |
| this.yOffsetForce = this.yOffset = 0; | |
| c.primaryColor = null; | |
| var t = c.secondaryColor = null, | |
| u = null; | |
| c.setShouldClear = | |
| function(a) { | |
| t && (t.shouldClear = a) | |
| }; | |
| c.clearCanvas = function() { | |
| t.clear() | |
| }; | |
| c.setWidth = function(a, f) { | |
| c.fullRibbonWidth = a; | |
| c.collapsedRibbonWidth = f; | |
| c.width = a; | |
| q = a / 136; | |
| for (var d = n; d;) d.setLengthMultiplier(q), d = d.nextSegment | |
| }; | |
| c.advance = function() { | |
| c.move(c.speed); | |
| var a = z(c.drivePoint), | |
| f = function(a, c) { | |
| a.setColor(); | |
| a.advance(); | |
| a.applyForces(c) | |
| }; | |
| f(a, SegmentAnchorPoint.CENTER); | |
| for (var d = a.previousSegment; d;) f(d, SegmentAnchorPoint.END), d = d.previousSegment; | |
| for (d = a.nextSegment; d;) f(d, SegmentAnchorPoint.START), d = d.nextSegment; | |
| if (c.drawStyle == DrawStyle.CANVAS_RIBBON) | |
| for (d = n; d;) d.resetPolygon(), d = d.nextSegment | |
| }; | |
| c.draw = function() { | |
| var a = C(), | |
| f = 5E-4 * (a - c.yOffset); | |
| c.yOffsetForce *= 0.95; | |
| c.yOffsetForce += f; | |
| var f = l.height * Math.pow(1 - c.positionDamping, 2), | |
| d = c.yOffset + c.yOffsetForce; | |
| Math.abs(a - d) > f / 2 && (d += ((0 < a - d ? a - f / 2 : a + f / 2) - d) * Math.max((c.positionDamping - 0.1) / 0.9, 0), c.yOffsetForce = d - c.yOffset); | |
| c.yOffset = d; | |
| if (c.drawStyle == DrawStyle.LINE) { | |
| k.clearRect(0, 0, l.width, l.height); | |
| k.strokeStyle = "#000000"; | |
| k.beginPath(); | |
| a = n; | |
| for (k.moveTo(a.startPoint.x, | |
| l.height / 2 + a.startPoint.y - c.yOffset); a;) k.lineTo(a.endPoint.x, l.height / 2 + a.endPoint.y - c.yOffset), a = a.nextSegment; | |
| k.stroke(); | |
| k.closePath(); | |
| for (a = n; a;) k.fillStyle = "#FF0000", k.beginPath(), k.arc(a.endPoint.x, l.height / 2 + a.endPoint.y - c.yOffset, 5, 0, 2 * Math.PI), k.fill(), k.closePath(), a = a.nextSegment | |
| } else c.drawStyle == DrawStyle.CANVAS_RIBBON ? (t.yOffset = c.yOffset, t.draw()) : c.drawStyle == DrawStyle.DOM_RIBBON && (u.yOffset = -c.yOffset + l.height / 2, u.update()) | |
| }; | |
| c.move = function(a) { | |
| for (var f = n; f;) f.move(a), f = f.nextSegment; | |
| c.canDestruct && c.destroySegments(); | |
| c.createSegments() | |
| }; | |
| c.straighten = function() { | |
| c.straightenStrength = Math.max(Math.min(c.straightenStrength, 1), 0); | |
| c.width = c.collapsedRibbonWidth + (c.fullRibbonWidth - c.collapsedRibbonWidth) * (1 - c.straightenStrength); | |
| var a; | |
| a = s ? s : z(0.5); | |
| a.width = c.width; | |
| a.straightenStrength = Math.min(c.straightenStrength + c.pullStrength, 1); | |
| a.applyForces(SegmentAnchorPoint.CENTER); | |
| for (var f = a.nextSegment, d; f;) { | |
| f.width = c.width; | |
| d = 1; | |
| if (0 < c.pullSpread) { | |
| d = f.distanceFromSegment(a, SearchDirection.LEFT) / | |
| (1 * w); | |
| var g = 2 * c.pullSpread, | |
| h = 2 * g; | |
| d = d < g ? 1 : d > h ? 0 : 1 - (d - g) / (h - g) | |
| } | |
| d *= c.pullStrength; | |
| f.straightenStrength = Math.min(c.straightenStrength + d, 1); | |
| f.applyForces(SegmentAnchorPoint.START); | |
| f = f.nextSegment | |
| } | |
| for (f = a.previousSegment; f;) f.width = c.width, d = 1, 0 < c.pullSpread && (d = f.distanceFromSegment(a, SearchDirection.RIGHT) / (1 * w), g = 2 * c.pullSpread, h = 2 * g, d = d < g ? 1 : d > h ? 0 : 1 - (d - g) / (h - g)), d *= c.pullStrength, f.straightenStrength = Math.min(c.straightenStrength + d, 1), f.applyForces(SegmentAnchorPoint.END), f = f.previousSegment | |
| }; | |
| c.setPullPoint = | |
| function(a) { | |
| s = z(a); | |
| w = r | |
| }; | |
| c.clearPullPoint = function() { | |
| s = null | |
| }; | |
| c.destroySegments = function() { | |
| for (; - 800 > n.endPoint.x;) t && t.removePolygon(n.polygon), u && u.removeSegment(n), r -= n.segmentLength, n = n.nextSegment, n.previousSegment = null; | |
| for (; p.startPoint.x > l.width + 800;) t && t.removePolygon(p.polygon), u && u.removeSegment(p), r -= p.segmentLength, p = p.previousSegment, p.nextSegment = null | |
| }; | |
| c.createSegments = function() { | |
| for (var a = [], f = !1; - 600 < n.startPoint.x;) { | |
| n = new RibbonSegment(n, c.primaryColor, c.secondaryColor, f); | |
| n.setLengthMultiplier(q); | |
| a.push(n); | |
| for (var d = 0; D(n) && 5 > d;) { | |
| d++; | |
| n = a[0].nextSegment; | |
| n.previousSegment = null; | |
| if (t) | |
| for (var g = a.length, h = 0; h < g; h++) t.removePolygon(a[h].polygon); | |
| if (u) | |
| for (g = a.length, h = 0; h < g; h++) u.removeSegment(a[h]); | |
| a = []; | |
| n = new RibbonSegment(n, c.primaryColor, c.secondaryColor, !0); | |
| n.setLengthMultiplier(q); | |
| a.push(n) | |
| } | |
| r += n.segmentLength; | |
| n.width = c.width; | |
| n.straightenStrength = Math.max(n.nextSegment.straightenStrength, c.pullStrength); | |
| n.applyForces(SegmentAnchorPoint.END); | |
| t && v(n); | |
| u && u.addSegment(n) | |
| } | |
| a = []; | |
| for (f = !1; p.endPoint.x < | |
| l.width + 600;) { | |
| p = new RibbonSegment(p, c.primaryColor, c.secondaryColor, f); | |
| p.setLengthMultiplier(q); | |
| a.push(p); | |
| for (d = 0; D(p) && 5 > d;) { | |
| d++; | |
| p = a[0].previousSegment; | |
| p.nextSegment = null; | |
| if (t) | |
| for (g = a.length, h = 0; h < g; h++) t.removePolygon(a[h].polygon); | |
| if (u) | |
| for (g = a.length, h = 0; h < g; h++) u.removeSegment(a[h]); | |
| a = []; | |
| p = new RibbonSegment(p, c.primaryColor, c.secondaryColor, !0); | |
| p.setLengthMultiplier(q); | |
| a.push(p) | |
| } | |
| r += p.segmentLength; | |
| p.width = c.width; | |
| p.straightenStrength = Math.max(p.previousSegment.straightenStrength, c.pullStrength); | |
| p.applyForces(SegmentAnchorPoint.START); | |
| t && v(p); | |
| u && u.addSegment(p) | |
| } | |
| }; | |
| c.resetSize = function() { | |
| l.width = h.clientWidth; | |
| l.height = h.clientHeight; | |
| t && t.resetSize() | |
| }; | |
| c.setColors = function(a, f) { | |
| c.primaryColor.setRed(a.getRed()); | |
| c.primaryColor.setGreen(a.getGreen()); | |
| c.primaryColor.setBlue(a.getBlue()); | |
| c.secondaryColor.setRed(f.getRed()); | |
| c.secondaryColor.setGreen(f.getGreen()); | |
| c.secondaryColor.setBlue(f.getBlue()) | |
| }; | |
| c.secondaryColorFromPrimaryColor = function(a) { | |
| return new Color(a.getHue(), a.getSaturation() + 7, a.getValue() - | |
| 19, ColorMode.HSV) | |
| }; | |
| c.getCurrentVerticalPosition = function() { | |
| for (var a = 0, f = 0, d = n; d;) a++, f += d.startPoint.y, f += d.endPoint.y, d = d.nextSegment; | |
| return (f / (2 * a) - c.yOffset + l.height / 2 - c.width / 2) / (l.height - c.width) | |
| }; | |
| var v = function(a) { | |
| a.backface ? t.addPolygonAtDepth(a.polygon, 1) : t.addPolygonAtDepth(a.polygon, 0) | |
| }, | |
| z = function(a) { | |
| for (var c = n; c;) { | |
| if (c.endPoint.x / l.width > a || !c.nextSegment) return c; | |
| c = c.nextSegment | |
| } | |
| }, | |
| C = function() { | |
| for (var a = 0, f = 0, d = n; d;) a++, f += d.startPoint.y, f += d.endPoint.y, d = d.nextSegment; | |
| return f / (2 * a) + | |
| (0.5 - c.verticalPosition) * (l.height - c.width) | |
| }, | |
| D = function(a) { | |
| var c; | |
| c = a.nextSegment ? 0 : 1; | |
| var f; | |
| f = 0 == c ? a.nextSegment.nextSegment : a.previousSegment.previousSegment; | |
| for (var d = 0; f && 6 > d;) { | |
| var g; | |
| g = a.originalStartPoint; | |
| var h = a.originalEndPoint, | |
| k = f.originalStartPoint, | |
| n = f.originalEndPoint, | |
| p = B(h, g), | |
| l = B(n, k), | |
| r = F(B(k, g), p), | |
| p = F(p, l); | |
| 0 == r && 0 == p ? g = 0 > k.x - g.x != 0 > k.x - h.x != 0 > n.x - g.x != 0 > n.x - h.x || 0 > k.y - g.y != 0 > k.y - h.y != 0 > n.y - g.y != 0 > n.y - h.y : 0 == p ? g = !1 : (h = r / p, g = F(B(k, g), l) / p, g = 0 <= g && 1 >= g && 0 <= h && 1 >= h); | |
| if (g) return !0; | |
| f = 0 == c ? f.nextSegment : | |
| f.previousSegment; | |
| d++ | |
| } | |
| return !1 | |
| }, | |
| F = function(a, c) { | |
| return a.x * c.y - a.y * c.x | |
| }, | |
| B = function(a, c) { | |
| var f = {}; | |
| f.x = a.x - c.x; | |
| f.y = a.y - c.y; | |
| return f | |
| }; | |
| (function(a, f, d, g) { | |
| h = a; | |
| h.getContext && (k = h.getContext("2d")); | |
| g || (g = 1); | |
| l.width = h.clientWidth; | |
| l.height = h.clientHeight; | |
| f && f.substr ? c.primaryColor = new Color(f) : f ? c.primaryColor = f : (c.primaryColor = new Color(255 * Math.random(), 255 * Math.random(), 255 * Math.random()), 20 > c.primaryColor.getValue() && c.primaryColor.setValue(20)); | |
| c.secondaryColor = d && d.substr ? new Color(d) : d ? d : c.secondaryColorFromPrimaryColor(c.primaryColor); | |
| c.drawStyle == DrawStyle.CANVAS_RIBBON && (t = new Flat3dSetup(h, g)); | |
| c.drawStyle == DrawStyle.DOM_RIBBON && (u = new RibbonDOMHolder(h)); | |
| n = new RibbonSegment(null, c.primaryColor, c.secondaryColor); | |
| n.setLengthMultiplier(q); | |
| p = n; | |
| r += n.segmentLength; | |
| a = n; | |
| t && v(a); | |
| u && u.addSegment(a); | |
| c.createSegments(); | |
| c.yOffset = C(); | |
| 0.5 < Math.random() && (c.speed *= -1) | |
| })(a, d, f, g) | |
| }; | |
| var segmentMinimumLength = 300, | |
| segmentMaximumLength = 700, | |
| AllowedDirection = { | |
| ANY: 0, | |
| UP: 1, | |
| DOWN: 2 | |
| }, | |
| SegmentAnchorPoint = { | |
| START: 0, | |
| CENTER: 1, | |
| END: 2 | |
| }, | |
| SearchDirection = { | |
| LEFT: 0, | |
| RIGHT: 1 | |
| }, | |
| oneSidedWeightedRandom = new WeightedRandom(1.5, WeightOption.NEUTRAL, WeightOption.STRONGER), | |
| twoSidedWeightedRandom = new WeightedRandom(1.5, WeightOption.STRONGER, WeightOption.STRONGER), | |
| degToRad = Math.PI / 180, | |
| RibbonSegment = function(a, d, f, g) { | |
| var c = this; | |
| c.previousSegment = null; | |
| c.nextSegment = null; | |
| c.backface = !1; | |
| c.startPoint = {}; | |
| c.endPoint = {}; | |
| c.width = | |
| 136; | |
| c.segmentLength = 0; | |
| c.originalStartPoint = {}; | |
| c.originalEndPoint = {}; | |
| c.straightenStrength = 0; | |
| c.simplexStepper = new SimplexStepper(0.6); | |
| c.polygon = new Polygon3D; | |
| c.primaryColor = d; | |
| c.secondaryColor = f; | |
| c.color = d; | |
| var h = 20, | |
| k = 1; | |
| this.move = function(a) { | |
| c.startPoint.x -= a; | |
| c.endPoint.x -= a | |
| }; | |
| this.advance = function() { | |
| c.simplexStepper.advance() | |
| }; | |
| this.applyForces = function(a) { | |
| var f = c.getCurrentAngle(), | |
| d = Math.cos(f * degToRad), | |
| f = Math.sin(f * degToRad); | |
| if (a == SegmentAnchorPoint.CENTER) { | |
| var g; | |
| a = (c.startPoint.x + c.endPoint.x) / 2; | |
| g = (c.startPoint.y + | |
| c.endPoint.y) / 2; | |
| c.endPoint.x = a + c.segmentLength / 2 * d; | |
| c.endPoint.y = g + c.segmentLength / 2 * f; | |
| c.startPoint.x = a - c.segmentLength / 2 * d; | |
| c.startPoint.y = g - c.segmentLength / 2 * f | |
| } else a == SegmentAnchorPoint.START ? (c.previousSegment && (c.startPoint.x = c.previousSegment.endPoint.x, c.startPoint.y = c.previousSegment.endPoint.y), c.endPoint.x = c.startPoint.x + c.segmentLength * d, c.endPoint.y = c.startPoint.y + c.segmentLength * f) : (c.nextSegment && (c.endPoint.x = c.nextSegment.startPoint.x, c.endPoint.y = c.nextSegment.startPoint.y), c.startPoint.x = | |
| c.endPoint.x - c.segmentLength * d, c.startPoint.y = c.endPoint.y - c.segmentLength * f) | |
| }; | |
| c.setColor = function() { | |
| if (c.backface) { | |
| var a = 360, | |
| f = c.getCurrentAngle(); | |
| c.previousSegment && (a = Math.min(a, Math.abs(f - c.previousSegment.getCurrentAngle()))); | |
| c.nextSegment && (a = Math.min(a, Math.abs(c.nextSegment.getCurrentAngle() - f))); | |
| a = Math.min(Math.max(a - 30, 0) / 10, 1); | |
| c.color.setRed(c.primaryColor.getRed() + (c.secondaryColor.getRed() - c.primaryColor.getRed()) * a); | |
| c.color.setGreen(c.primaryColor.getGreen() + (c.secondaryColor.getGreen() - | |
| c.primaryColor.getGreen()) * a); | |
| c.color.setBlue(c.primaryColor.getBlue() + (c.secondaryColor.getBlue() - c.primaryColor.getBlue()) * a) | |
| } | |
| }; | |
| c.getCurrentAngle = function() { | |
| var a = -(h / 2) + h * c.simplexStepper.getValue(); | |
| return (c.primaryAngle + a) * (1 - c.straightenStrength) | |
| }; | |
| c.resetPolygon = function() { | |
| var a = c.getCurrentAngle(), | |
| f = a - 180; - 180 > f && (f += 360); | |
| var d = f - 90, | |
| g = f + 90, | |
| h = a - 90, | |
| k = a + 90, | |
| l = 0; | |
| if (c.previousSegment) { | |
| var u = c.previousSegment.getCurrentAngle(), | |
| g = a - u, | |
| v = Math.abs(g); | |
| 45 < v ? (l = (u + a) / 2, f = a - 180, -180 > f && (f += 360), d = c.width / | |
| 2 / Math.cos((f + 90 - l) * degToRad), c.polygon.points[0].x = c.startPoint.x - d * Math.cos(l * degToRad), c.polygon.points[0].y = c.startPoint.y - d * Math.sin(l * degToRad), c.polygon.points[0].z = c.startPoint.z, c.polygon.points[1].x = c.startPoint.x + d * Math.cos(l * degToRad), c.polygon.points[1].y = c.startPoint.y + d * Math.sin(l * degToRad), c.polygon.points[1].z = c.startPoint.z, l = 2) : 30 < v ? (l = (u + a) / 2, f = a - 180, -180 > f && (f += 360), d = c.width / 2 / Math.cos((f + 90 - l) * degToRad), c.polygon.points[0].x = c.startPoint.x - d * Math.cos(l * degToRad), c.polygon.points[0].y = | |
| c.startPoint.y - d * Math.sin(l * degToRad), c.polygon.points[0].z = c.startPoint.z, c.polygon.points[2].x = c.startPoint.x + d * Math.cos(l * degToRad), c.polygon.points[2].y = c.startPoint.y + d * Math.sin(l * degToRad), c.polygon.points[2].z = c.startPoint.z, d = 1 - (v - 30) / 15, l = (a + u) / 2 + 90, 180 < l && (l -= 360), f = a - 180, -180 > f && (f += 360), d *= c.width / 2 / Math.cos((l - (f + 90)) * degToRad), 0 < g ? (c.polygon.points[1].x = c.startPoint.x + d * Math.cos(l * degToRad), c.polygon.points[1].y = c.startPoint.y + d * Math.sin(l * degToRad)) : (c.polygon.points[1].x = c.startPoint.x - | |
| d * Math.cos(l * degToRad), c.polygon.points[1].y = c.startPoint.y - d * Math.sin(l * degToRad)), c.polygon.points[1].z = c.startPoint.z, l = 3) : (l = (a + u) / 2 + 90, 180 < l && (l -= 360), f = a - 180, -180 > f && (f += 360), d = c.width / 2 / Math.cos((l - (f + 90)) * degToRad), g = c.startPoint.x - 0.5 * Math.cos(a * degToRad), v = c.startPoint.y - 0.5 * Math.sin(a * degToRad), f = c.startPoint.z, c.polygon.points[0].x = g - d * Math.cos(l * degToRad), c.polygon.points[0].y = v - d * Math.sin(l * degToRad), c.polygon.points[0].z = f, c.polygon.points[1].x = g + d * Math.cos(l * degToRad), c.polygon.points[1].y = | |
| v + d * Math.sin(l * degToRad), c.polygon.points[1].z = f, l = 2) | |
| } else c.polygon.points[0].x = c.startPoint.x + c.width / 2 * Math.cos(d * degToRad), c.polygon.points[0].y = c.startPoint.y + c.width / 2 * Math.sin(d * degToRad), c.polygon.points[0].z = c.startPoint.z, c.polygon.points[1].x = c.startPoint.x + c.width / 2 * Math.cos(g * degToRad), c.polygon.points[1].y = c.startPoint.y + c.width / 2 * Math.sin(g * degToRad), c.polygon.points[1].z = c.startPoint.z, l = 2; | |
| c.nextSegment ? (k = c.nextSegment.getCurrentAngle(), g = k - a, v = Math.abs(g), 45 < v ? (c.polygon.setVerticesLength(l + | |
| 2), h = (a + k) / 2, d = c.width / 2 / Math.cos((a + 90 - h) * degToRad), c.polygon.points[l].x = c.endPoint.x - d * Math.cos(h * degToRad), c.polygon.points[l].y = c.endPoint.y - d * Math.sin(h * degToRad), c.polygon.points[l].z = c.endPoint.z, c.polygon.points[l + 1].x = c.endPoint.x + d * Math.cos(h * degToRad), c.polygon.points[l + 1].y = c.endPoint.y + d * Math.sin(h * degToRad), c.polygon.points[l + 1].z = c.endPoint.z) : 30 < v ? (c.polygon.setVerticesLength(l + 3), h = (a + k) / 2, d = c.width / 2 / Math.cos((a + 90 - h) * degToRad), c.polygon.points[l].x = c.endPoint.x - d * Math.cos(h * degToRad), | |
| c.polygon.points[l].y = c.endPoint.y - d * Math.sin(h * degToRad), c.polygon.points[l].z = c.endPoint.z, c.polygon.points[l + 2].x = c.endPoint.x + d * Math.cos(h * degToRad), c.polygon.points[l + 2].y = c.endPoint.y + d * Math.sin(h * degToRad), c.polygon.points[l + 2].z = c.endPoint.z, d = 1 - (v - 30) / 15, h = (a + k) / 2 + 90, 180 < h && (h -= 360), d *= c.width / 2 / Math.cos((h - (a + 90)) * degToRad), 0 < g ? (c.polygon.points[l + 1].x = c.endPoint.x - d * Math.cos(h * degToRad), c.polygon.points[l + 1].y = c.endPoint.y - d * Math.sin(h * degToRad)) : (c.polygon.points[l + 1].x = c.endPoint.x + d * | |
| Math.cos(h * degToRad), c.polygon.points[l + 1].y = c.endPoint.y + d * Math.sin(h * degToRad)), c.polygon.points[l + 1].z = c.startPoint.z) : (c.polygon.setVerticesLength(l + 2), h = (a + k) / 2 + 90, 180 < h && (h -= 360), d = c.width / 2 / Math.cos((h - (a + 90)) * degToRad), k = c.endPoint.x + 0.5 * Math.cos(a * degToRad), a = c.endPoint.y + 0.5 * Math.sin(a * degToRad), g = c.endPoint.z, c.polygon.points[l].x = k - d * Math.cos(h * degToRad), c.polygon.points[l].y = a - d * Math.sin(h * degToRad), c.polygon.points[l].z = g, c.polygon.points[l + 1].x = k + d * Math.cos(h * degToRad), c.polygon.points[l + | |
| 1].y = a + d * Math.sin(h * degToRad), c.polygon.points[l + 1].z = g)) : (c.polygon.setVerticesLength(l + 2), c.polygon.points[l].x = c.endPoint.x + c.width / 2 * Math.cos(h * degToRad), c.polygon.points[l].y = c.endPoint.y + c.width / 2 * Math.sin(h * degToRad), c.polygon.points[l].z = c.endPoint.z, c.polygon.points[l + 1].x = c.endPoint.x + c.width / 2 * Math.cos(k * degToRad), c.polygon.points[l + 1].y = c.endPoint.y + c.width / 2 * Math.sin(k * degToRad), c.polygon.points[l + 1].z = c.endPoint.z) | |
| }; | |
| c.distanceFromSegment = function(a, f) { | |
| var d = 0; | |
| if (a == c) return d; | |
| var g; | |
| if (f == SearchDirection.LEFT) | |
| for (g = c.previousSegment; g && g != a;) d += g.segmentLength, g = g.previousSegment; | |
| else | |
| for (g = c.nextSegment; g && g != a;) d += g.segmentLength, g = g.nextSegment; | |
| return d += a.segmentLength / 2 | |
| }; | |
| c.getStartEndCapLength = function() { | |
| if (c.previousSegment) { | |
| var a = c.getCurrentAngle(), | |
| f = c.previousSegment.getCurrentAngle(); | |
| if (45 < Math.abs(a - f)) { | |
| var d = a - 180; - 180 > d && (d += 360); | |
| return Math.abs(Math.tan((d + 90 - (f + a) / 2) * degToRad) * (c.width / 2)) | |
| } | |
| } | |
| return 0 | |
| }; | |
| c.getEndEndCapLength = function() { | |
| if (c.nextSegment) { | |
| var a = c.getCurrentAngle(), | |
| f = c.nextSegment.getCurrentAngle(); | |
| if (45 < Math.abs(f - a)) return Math.abs(Math.tan((a + 90 - (a + f) / 2) * degToRad) * (c.width / 2)) | |
| } | |
| return 0 | |
| }; | |
| c.setLengthMultiplier = function(a) { | |
| newMultiplier = a / k; | |
| k = a; | |
| c.segmentLength *= newMultiplier | |
| }; | |
| var l = function(a, c, f) { | |
| return f == AllowedDirection.UP ? -Math.abs(oneSidedWeightedRandom.random() * a) : f == AllowedDirection.DOWN ? Math.abs(oneSidedWeightedRandom.random() * c) : a + twoSidedWeightedRandom.random() * (c - a) | |
| }; | |
| (function(a, f) { | |
| for (var d = "", g = 32; 0 < g; --g) d += "0123456789abcdefghijklmnopqrstuvwxyz" [Math.round(35 * | |
| Math.random())]; | |
| c.identifier = d; | |
| a && (c.backface = !a.backface, c.backface && (c.color = new Color(0, 0, 0), h /= 2)); | |
| c.polygon.color = c.color; | |
| a && a.nextSegment && !a.previousSegment ? (c.nextSegment = a, c.nextSegment.previousSegment = c, c.endPoint.x = c.nextSegment.startPoint.x, c.endPoint.y = c.nextSegment.startPoint.y, c.endPoint.z = c.nextSegment.startPoint.z, c.originalEndPoint.x = c.nextSegment.originalStartPoint.x, c.originalEndPoint.y = c.nextSegment.originalStartPoint.y, c.originalEndPoint.z = c.nextSegment.originalStartPoint.z) : | |
| a ? (c.previousSegment = a, c.previousSegment.nextSegment = c, c.startPoint.x = c.previousSegment.endPoint.x, c.startPoint.y = c.previousSegment.endPoint.y, c.startPoint.z = c.previousSegment.endPoint.z, c.originalStartPoint.x = c.previousSegment.originalEndPoint.x, c.originalStartPoint.y = c.previousSegment.originalEndPoint.y, c.originalStartPoint.z = c.previousSegment.originalEndPoint.z) : (c.startPoint.x = -700, c.startPoint.y = 0, c.startPoint.z = 0, c.originalStartPoint.x = c.startPoint.x, c.originalStartPoint.y = c.startPoint.y, c.originalStartPoint.z = | |
| c.startPoint.z); | |
| d = AllowedDirection.ANY; | |
| f || (c.previousSegment ? (100 <= c.originalStartPoint.y && (d = AllowedDirection.UP), -100 >= c.originalStartPoint.y && (d = AllowedDirection.DOWN)) : c.nextSegment && (100 <= c.originalEndPoint.y && (d = AllowedDirection.DOWN), -100 >= c.originalEndPoint.y && (d = AllowedDirection.UP))); | |
| c.previousSegment ? (c.primaryAngle = -30 < c.previousSegment.primaryAngle && 30 > c.previousSegment.primaryAngle ? l(-130, 130, d) : -90 < c.previousSegment.primaryAngle && 90 > c.previousSegment.primaryAngle ? l(-60, 60, d) : -90 >= c.previousSegment.primaryAngle ? | |
| l(c.previousSegment.primaryAngle + 90 - 45, c.previousSegment.primaryAngle + 90 + 45, d) : l(c.previousSegment.primaryAngle - 90 - 45, c.previousSegment.primaryAngle - 90 + 45, d), d = c.primaryAngle - c.previousSegment.primaryAngle, 55 > d && -55 < d && (c.primaryAngle = 0 < d ? c.previousSegment.primaryAngle + 55.55 : c.previousSegment.primaryAngle - 55.55)) : c.nextSegment ? (c.primaryAngle = -30 < c.nextSegment.primaryAngle && 30 > c.nextSegment.primaryAngle ? l(-130, 130, d) : -90 < c.nextSegment.primaryAngle && 90 > c.nextSegment.primaryAngle ? l(-60, 60, d) : -90 >= c.nextSegment.primaryAngle ? | |
| l(c.nextSegment.primaryAngle + 90 - 45, c.nextSegment.primaryAngle + 90 + 45, d) : l(c.nextSegment.primaryAngle - 90 - 45, c.nextSegment.primaryAngle - 90 + 45, d), d = c.nextSegment.primaryAngle - c.primaryAngle, 55 > d && -55 < d && (c.primaryAngle = 0 < d ? c.nextSegment.primaryAngle + 55.55 : c.nextSegment.primaryAngle - 55.55)) : c.primaryAngle = l(-130, 130, d); | |
| d = Math.random(); | |
| d = c.previousSegment && 90 < Math.abs(c.previousSegment.primaryAngle) && 90 > Math.abs(c.primaryAngle) ? 0.6 + 0.4 * d : c.nextSegment && 90 < Math.abs(c.nextSegment.primaryAngle) && 90 > Math.abs(c.primaryAngle) ? | |
| 0.6 + 0.4 * d : -90 < c.primaryAngle && 90 > c.primaryAngle ? 0.3 + 0.7 * d : 0.3 * d; | |
| c.segmentLength = segmentMinimumLength + d * (segmentMaximumLength - segmentMinimumLength); | |
| c.nextSegment ? (c.startPoint.x = c.endPoint.x - c.segmentLength * Math.cos(c.primaryAngle * degToRad), c.startPoint.y = c.endPoint.y - c.segmentLength * Math.sin(c.primaryAngle * degToRad), c.startPoint.z = 0, c.originalStartPoint.x = c.originalEndPoint.x - c.segmentLength * Math.cos(c.primaryAngle * degToRad), c.originalStartPoint.y = c.originalEndPoint.y - c.segmentLength * Math.sin(c.primaryAngle * | |
| degToRad), c.originalStartPoint.z = 0) : (c.endPoint.x = c.startPoint.x + c.segmentLength * Math.cos(c.primaryAngle * degToRad), c.endPoint.y = c.startPoint.y + c.segmentLength * Math.sin(c.primaryAngle * degToRad), c.endPoint.z = 0, c.originalEndPoint.x = c.originalStartPoint.x + c.segmentLength * Math.cos(c.primaryAngle * degToRad), c.originalEndPoint.y = c.originalStartPoint.y + c.segmentLength * Math.sin(c.primaryAngle * degToRad), c.originalEndPoint.z = 0) | |
| })(a, g) | |
| }; | |
| var RibbonDOMHolder = function(a) { | |
| var d = this; | |
| d.holder = null; | |
| d.yOffset = 0; | |
| var f = [], | |
| g = []; | |
| d.addSegment = function(a) { | |
| console.log("addSegment", a.identifier); | |
| f.push(new RibbonDOMSegment(a, c())) | |
| }; | |
| d.removeSegment = function(a) { | |
| console.log("removeSegment", a.identifier); | |
| for (var c = f.length, d = 0; d < c; d++) | |
| if (f[d].segment === a) { | |
| a = f[d].element; | |
| a.style.display = "none"; | |
| g.push(a); | |
| f.splice(d, 1); | |
| break | |
| } | |
| }; | |
| d.update = function() { | |
| for (var a = f.length, c = 0; c < a; c++) f[c].yOffset = d.yOffset, f[c].update() | |
| }; | |
| var c = function() { | |
| if (g.length) return g.pop(); | |
| var a = document.createElement("div"); | |
| a.className = "ribbon-segment"; | |
| a.style.width = "300px"; | |
| a.style.height = "100px"; | |
| a.style.display = "none"; | |
| a.style.position = "absolute"; | |
| a.style.top = "-50px"; | |
| a.style.left = "-150px"; | |
| a.style.webkitTransformOrigin = "50% 50% 0"; | |
| d.holder.appendChild(a); | |
| var c = document.createElement("div"); | |
| c.className = "start-triangle"; | |
| c.style.width = "0"; | |
| c.style.height = "0"; | |
| c.style.borderStyle = "solid"; | |
| c.style.borderWidth = "0 0 100px 100px"; | |
| c.style.borderColor = "transparent transparent #007bff transparent"; | |
| c.style.position = "absolute"; | |
| c.style.left = "0"; | |
| c.style.webkitTransformOrigin = "0% 50% 0"; | |
| a.appendChild(c); | |
| c = document.createElement("div"); | |
| c.className = "end-triangle"; | |
| c.style.width = "0"; | |
| c.style.height = "0"; | |
| c.style.borderStyle = "solid"; | |
| c.style.borderWidth = "100px 100px 0 0"; | |
| c.style.borderColor = "#007bff transparent transparent transparent"; | |
| c.style.position = "absolute"; | |
| c.style.right = "0"; | |
| c.style.webkitTransformOrigin = "100% 50% 0"; | |
| a.appendChild(c); | |
| c = document.createElement("div"); | |
| c.className = "center-fill"; | |
| c.style.width = | |
| "100px"; | |
| c.style.height = "100px"; | |
| c.style.backgroundColor = "red"; | |
| c.style.webkitTransformOrigin = "0% 50% 0"; | |
| a.appendChild(c); | |
| return a | |
| }; | |
| d.holder = a | |
| }; | |
| var RibbonDOMSegment = function(a, d) { | |
| var f = this; | |
| f.segment = null; | |
| f.element = null; | |
| f.centerFill = null; | |
| f.startTriangle = null; | |
| f.endTriangle = null; | |
| f.yOffset = 0; | |
| f.update = function() { | |
| var a = f.segment.getStartEndCapLength(), | |
| c = f.segment.getEndEndCapLength(), | |
| d = (f.segment.segmentLength + a + c) / 300, | |
| k = f.segment.width / 100, | |
| l = (c - a) / 2, | |
| n = (f.segment.startPoint.x + f.segment.endPoint.x) / 2 + Math.cos(f.segment.getCurrentAngle() * Math.PI / 180) * l, | |
| l = (f.segment.startPoint.y + f.segment.endPoint.y) / 2 + f.yOffset + Math.sin(f.segment.getCurrentAngle() * | |
| Math.PI / 180) * l, | |
| p = f.segment.getCurrentAngle(); | |
| f.element.style.webkitTransform = "translate3d(" + n + "px," + l + "px, 0px) rotate3d(0,0,1," + p * Math.PI / 180 + "rad) scale3d(" + d + "," + k + ",1)"; | |
| f.element.style.zIndex = f.segment.backface ? 0 : 1; | |
| d = 2 * a / (f.segment.segmentLength + a + c); | |
| k = 1; | |
| f.segment.previousSegment && f.segment.previousSegment.getCurrentAngle() > f.segment.getCurrentAngle() && (k = -1); | |
| f.startTriangle.style.webkitTransform = "scale3d(" + 3 * d + ", " + k + ", 1)"; | |
| k = 2 * c / (f.segment.segmentLength + a + c); | |
| n = 1; | |
| f.segment.nextSegment && f.segment.getCurrentAngle() < | |
| f.segment.nextSegment.getCurrentAngle() && (n = -1); | |
| f.endTriangle.style.webkitTransform = "scale3d(" + 3 * k + ", " + n + ", 1)"; | |
| a = 0.5 / (f.segment.segmentLength + a + c); | |
| f.centerFill.style.webkitTransform = "translate3d(" + 300 * (d - a) + "%, 0px, 0px) scale3d(" + 3 * (1 - (d + k) + a + a) + ", 1, 1)" | |
| }; | |
| (function(a, c) { | |
| f.segment = a; | |
| f.element = c; | |
| f.element.style.display = "block"; | |
| f.centerFill = f.element.getElementsByClassName("center-fill")[0]; | |
| f.startTriangle = f.element.getElementsByClassName("start-triangle")[0]; | |
| f.endTriangle = f.element.getElementsByClassName("end-triangle")[0]; | |
| f.update() | |
| })(a, d) | |
| }; | |
| var RibbonPullDirection = { | |
| RIGHT: 0, | |
| LEFT: 1 | |
| }, | |
| RibbonInteractionManager = function(a) { | |
| this.ribbon = a; | |
| var d = function() { | |
| a.advance(); | |
| a.draw() | |
| }; | |
| this.attachToRenderFrame = function() { | |
| GlobalEvents.addListener(GlobalEvent.RENDER_FRAME, d) | |
| }; | |
| this.detachFromRenderFrame = function() { | |
| GlobalEvents.removeListener(GlobalEvent.RENDER_FRAME, d) | |
| }; | |
| this.animateToTop = function(d) { | |
| var g = { | |
| value: 0 | |
| }; | |
| new Tween(g, 860, { | |
| value: 1, | |
| ease: Ease.easeIn.sine, | |
| onUpdate: function(c) { | |
| a.verticalPosition = 0.5 - 0.5 * g.value; | |
| a.positionDamping = g.value; | |
| a.straightenStrength = | |
| Math.min(g.value / 0.85, 1); | |
| a.straighten() | |
| }, | |
| onComplete: function(a) { | |
| d && d() | |
| } | |
| }) | |
| }; | |
| this.releaseFromTop = function() { | |
| var d = { | |
| value: 1 | |
| }; | |
| new Tween(d, 860, { | |
| value: 0, | |
| ease: Ease.easeOut.sine, | |
| onUpdate: function(g) { | |
| a.verticalPosition = 0.5 - 0.5 * d.value; | |
| a.positionDamping = d.value; | |
| a.straightenStrength = Math.min(d.value / 0.85, 1); | |
| a.straighten() | |
| }, | |
| onComplete: function(a) {} | |
| }) | |
| }; | |
| this.animatePull = function(d, g) { | |
| g || (g = new Color(255 * Math.random(), 255 * Math.random(), 255 * Math.random())); | |
| var c, h, k; | |
| d == RibbonPullDirection.RIGHT ? (c = 0, h = 50, k = Math.abs(a.idleSpeed)) : | |
| (c = 1, h = -50, k = -Math.abs(a.idleSpeed)); | |
| var l = new ColorTransition(a.primaryColor.clone(), g), | |
| n = new ColorTransition(a.secondaryColor.clone(), a.secondaryColorFromPrimaryColor(g)); | |
| a.canDestruct = !1; | |
| a.setPullPoint(c); | |
| var p = a.speed, | |
| r = { | |
| value: 0 | |
| }; | |
| new Tween(r, 750, { | |
| value: 1, | |
| ease: Ease.easeInOut.sine, | |
| onUpdate: function(c) { | |
| a.pullStrength = 0.3 * r.value; | |
| a.pullSpread = r.value; | |
| a.straighten(); | |
| a.speed = (h - p) * Math.min(r.value / 0.3, 1) + p | |
| }, | |
| onComplete: function(c) { | |
| a.destroySegments(); | |
| a.setPullPoint(0.5); | |
| new Tween(r, 1150, { | |
| delay: 50, | |
| value: 0, | |
| ease: Ease.easeOut.back, | |
| onUpdate: function(c) { | |
| a.pullStrength = 0.3 * r.value; | |
| a.pullSpread = r.value; | |
| a.straighten() | |
| } | |
| }); | |
| var d = { | |
| value: 1 | |
| }; | |
| new Tween(d, 1250, { | |
| delay: 50, | |
| value: 0, | |
| ease: Ease.easeOut.cubic, | |
| onUpdate: function(c) { | |
| a.speed = (h - k) * d.value + k | |
| }, | |
| onComplete: function(c) { | |
| a.canDestruct = !0; | |
| a.clearPullPoint() | |
| } | |
| }) | |
| } | |
| }); | |
| var q = { | |
| value: 0 | |
| }; | |
| new Tween(q, 2050, { | |
| value: 1, | |
| ease: Ease.easeInOut.cubic, | |
| onUpdate: function(c) { | |
| a.setColors(l.getColorAtValue(q.value), n.getColorAtValue(q.value)) | |
| } | |
| }) | |
| }; | |
| this.attachToRenderFrame() | |
| }; | |
| var DribbbleShots = function(a, d, f, g, c) { | |
| var h = this, | |
| k = !1, | |
| l = !1, | |
| n = !1, | |
| p = 0; | |
| h.scale = c; | |
| this.load = function() { | |
| k || (k = !0, new Ajax({ | |
| method: "GET", | |
| path: "/dribbble-project/" + d + "/", | |
| onComplete: r, | |
| onFailure: function() { | |
| k = !1 | |
| } | |
| })) | |
| }; | |
| this.setOnscreen = function(a) { | |
| n = a; | |
| for (var c = 0; c < p; c++) h.shots[c].setOnscreen(a); | |
| n && !l && q() | |
| }; | |
| var r = function(a) { | |
| h.shots = []; | |
| h.loadIndex = 0; | |
| for (var c = a.length, d = [], f = 0; f < Math.min(6, c);) { | |
| var g = Math.floor(Math.random() * (c - f)); | |
| d.push(a[g]); | |
| a.splice(g, 1); | |
| f++ | |
| } | |
| p = Math.min(c, 6); | |
| for (a = 0; a < p; a++) c = d[a], f = document.createElement("canvas"), | |
| f.id = "canvas" + a, f.width = 300 * h.scale, f.height = 300 * h.scale, c = new Triangle(f, c, h.primaryColor, h.ctaColor, h.scale, n), h.shots.push(c), h.container.appendChild(c.stage.canvas); | |
| n && q(); | |
| GlobalEvents.addListener("TriangleToggleIn", w); | |
| GlobalEvents.addListener("TriangleToggleOut", t) | |
| }, | |
| q = function() { | |
| h.shots && h.shots.length && (l = !0, GlobalEvents.addListener("TriangleLoad", s), h.shots[0].load()) | |
| }, | |
| s = function() { | |
| var a = h.shots[++h.loadIndex]; | |
| a && a.load() | |
| }, | |
| w = function(a) { | |
| a.triangle != h.activeTriangle && h.activeTriangle && h.activeTriangle.triangleMorph(); | |
| h.activeTriangle = a.triangle | |
| }, | |
| t = function(a) { | |
| a.triangle == h.activeTriangle && (h.activeTriangle = null) | |
| }; | |
| (function(a, c, d, f) { | |
| h.container = a; | |
| h.project = c; | |
| h.primaryColor = d; | |
| h.ctaColor = f | |
| })(a, d, f, g) | |
| }; | |
| Events = { | |
| registry: {}, | |
| dispatch: function(a, d) { | |
| var f = a.uid; | |
| this.register(f, d.name); | |
| for (var f = this.registry[f][d.name], g = 0; g < f.length; g++) f[g](d) | |
| }, | |
| addListener: function(a, d, f) { | |
| f && (a = a.uid, this.register(a, d), this.registry[a][d].push(f)) | |
| }, | |
| removeListener: function(a, d, f) { | |
| a = this.registry[a.uid][d]; | |
| for (d = 0; d < a.length; d++) f == a[d] && a.splice(d, 1) | |
| }, | |
| register: function(a, d) { | |
| this.registry[a] || (this.registry[a] = {}); | |
| this.registry[a][d] || (this.registry[a][d] = []) | |
| }, | |
| destroy: function(a, d) { | |
| this.registry[a.uid][d] = !1 | |
| }, | |
| showRegistry: function(a, | |
| d) { | |
| console.log(this.registry) | |
| } | |
| }; | |
| var Sprite = function() { | |
| this.stage = null; | |
| this.height = this.width = this.y = this.x = 0; | |
| this.scaleY = this.scaleX = this.scale = 1; | |
| this.rotation = 0; | |
| this.alpha = 1; | |
| this.visible = !0; | |
| this.uid = Stage.getUniqueID(); | |
| this.mouseColor = Stage.getMouseColor(); | |
| this.mouseString = this.mouseColor.getHex(); | |
| this.mouseEnabled = !1; | |
| this.children = []; | |
| this.mother = null; | |
| this.render = function(a, d) { | |
| if (this.stage && this.visible) { | |
| a.save(); | |
| a.translate(this.x, this.y); | |
| a.scale(this.scaleX, this.scaleY); | |
| a.rotate(this.rotation * (Math.PI / 180)); | |
| if (d) { | |
| this.mouseEnabled && | |
| this.mouseDraw(a); | |
| for (var f = 0; f < this.children.length; f++) this.children[f].render(a, d) | |
| } else { | |
| a.globalAlpha *= this.alpha; | |
| this.draw(a); | |
| for (f = 0; f < this.children.length; f++) this.children[f].render(a, d); | |
| this.afterDraw(a) | |
| } | |
| a.restore() | |
| } | |
| }; | |
| this.setStage = function(a) { | |
| a && !this.stage ? a.addMouseColor(this) : !a && this.stage && this.stage.removeMouseColor(this); | |
| this.stage = a; | |
| for (var d = 0; d < this.children.length; d++) this.children[d].setStage(a) | |
| }; | |
| this.dispatchEvent = function(a) { | |
| Events.dispatch(this, a) | |
| }; | |
| this.addEventListener = function(a, | |
| d) { | |
| Events.addListener(this, a, d) | |
| }; | |
| this.removeEventListener = function(a, d) { | |
| Events.removeListener(this, a, d) | |
| }; | |
| this.dispatchRollOver = function() { | |
| !this.mouseOver && this.mouseEnabled && (this.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OVER)), this.mouseOver = !0) | |
| }; | |
| this.dispatchRollOut = function() { | |
| this.mouseOver && this.mouseEnabled && (this.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT)), this.mouseOver = !1) | |
| }; | |
| this.resetMouse = function() { | |
| this.mouseOver = !1; | |
| for (var a = 0; a < this.children.length; a++) this.children[a].resetMouse() | |
| }; | |
| this.addChild = function(a) { | |
| this.children.push(a); | |
| a.setStage(this.stage); | |
| a.mother = this | |
| }; | |
| this.removeChild = function(a) { | |
| var d = this.getChildIndex(a); | |
| this.children.splice(d, 1); | |
| a.setStage(null); | |
| a.mother = null; | |
| a.resetMouse() | |
| }; | |
| this.setChildIndex = function(a, d) { | |
| var f = this.getChildIndex(a); | |
| this.children.splice(f, 1); | |
| this.children.splice(d, 0, a) | |
| }; | |
| this.getChildIndex = function(a) { | |
| var d = this.children.indexOf(a); | |
| if (-1 == d) throw a + " is not a child of " + this; | |
| return d | |
| }; | |
| this.isChildOf = function(a) { | |
| return a ? a == this.mother ? !0 : | |
| this.isChildOf(a.mother) : !1 | |
| }; | |
| this.getAncestry = function() { | |
| for (var a = this, d = [this]; a.mother;) d.push(a.mother), a = a.mother; | |
| return d | |
| }; | |
| this.getProgeny = function() { | |
| for (var a = [this], d = 0; d < this.children.length; d++) a.concat(this.children[d].getProgeny()); | |
| return a | |
| }; | |
| this.getUncommonAncestors = function(a) { | |
| if (!a) return this.getAncestry(); | |
| var d = this.getAncestry(); | |
| a = a.getAncestry(); | |
| for (var f = 0; f < a.length; f++) { | |
| var g = d.indexOf(a[f]); - 1 != g && d.splice(g, 1) | |
| } | |
| return d | |
| }; | |
| this.draw = function(a) {}; | |
| this.mouseDraw = function(a) {}; | |
| this.afterDraw = function(a) {}; | |
| this.toString = function() { | |
| return "[object Sprite]" | |
| } | |
| }; | |
| var Stage = function(a, d) { | |
| var f = this; | |
| this.scale = 1; | |
| this.canvas = a; | |
| this.children = this.context = null; | |
| this.mouseColors = {}; | |
| this.mouseContext = this.mouseCanvas = null; | |
| this.mouseOver = !1; | |
| this.mouseFocus = void 0; | |
| this.mouseEnabled = !1; | |
| this.layerY = this.layerX = 0; | |
| this.__construct__ = function() { | |
| this.children = []; | |
| this.uid = Stage.getUniqueID(); | |
| this.context = this.canvas.getContext("2d"); | |
| this.mouseCanvas = document.createElement("canvas"); | |
| this.mouseContext = this.mouseCanvas.getContext("2d"); | |
| this.mouseCanvas.width = this.canvas.width; | |
| this.mouseCanvas.height = this.canvas.height; | |
| Stage.globalContext = this.context | |
| }; | |
| this.enableMouse = function() { | |
| if (this.mouseEnabled) return !1; | |
| this.canvas.onmousemove = this.onMouseMove; | |
| this.canvas.onmouseover = this.onMouseOver; | |
| this.canvas.onmouseout = this.onMouseOut; | |
| this.canvas.onmousedown = this.onMouseDown; | |
| this.canvas.onmouseup = this.onMouseUp; | |
| this.canvas.onclick = this.onMouseClick; | |
| this.mouseEnabled = !0 | |
| }; | |
| this.disableMouse = function() { | |
| if (!this.mouseEnabled) return !1; | |
| this.canvas.onmousemove = void 0; | |
| this.canvas.onmouseover = | |
| void 0; | |
| this.canvas.onmouseout = void 0; | |
| this.canvas.onmousedown = void 0; | |
| this.canvas.onmouseup = void 0; | |
| this.canvas.onclick = void 0; | |
| this.mouseEnabled = !1; | |
| this.mouseFocus = void 0; | |
| this.mouseOver = !1; | |
| for (var a = 0; a < this.children.length; a++) this.children[a].resetMouse() | |
| }; | |
| this.refreshCanvas = function(a, c) { | |
| f.context.clearRect(0, 0, f.canvas.width, f.canvas.height) | |
| }; | |
| this.refreshMouseCanvas = function(a, c) {}; | |
| this.startRendering = function() { | |
| f.rendering || (GlobalEvents.addListener(GlobalEvent.RENDER_FRAME, this.render), GlobalEvents.addListener(GlobalEvent.MOUSE_EVAL, | |
| this.evaluateMouse), f.rendering = !0) | |
| }; | |
| this.stopRendering = function() { | |
| f.rendering && (GlobalEvents.removeListener(GlobalEvent.RENDER_FRAME, this.render), GlobalEvents.removeListener(GlobalEvent.MOUSE_EVAL, this.evaluateMouse), f.rendering = !1) | |
| }; | |
| this.render = function() { | |
| f.refreshCanvas(); | |
| f.mouseEnabled && f.refreshMouseCanvas(); | |
| for (var a = 0; a < f.children.length; a++) { | |
| var c = f.children[a]; | |
| c.render(f.context); | |
| f.mouseEnabled && (c.render(f.mouseContext, !0), f.dispatchMouseEvents()) | |
| } | |
| }; | |
| this.dispatchMouseEvents = function() { | |
| if (this.mouseOver) { | |
| try { | |
| var a = | |
| this.mouseContext.getImageData(this.layerX * this.scale, this.layerY * this.scale, 1, 1).data | |
| } catch (c) { | |
| return !1 | |
| } | |
| a = new Color(a[0], a[1], a[2]); | |
| a = this.mouseColors[a.getHexValue()]; | |
| if (a != this.mouseFocus) { | |
| if (this.mouseFocus) | |
| for (var d = this.mouseFocus.getUncommonAncestors(a), f = 0; f < d.length; f++) d[f].dispatchRollOut(); | |
| if (a) | |
| for (d = a.getAncestry(), f = 0; f < d.length; f++) d[f].dispatchRollOver(); | |
| this.mouseFocus = a; | |
| this.evaluateMouse() | |
| } | |
| } | |
| }; | |
| this.evaluateMouse = function() { | |
| for (var a = "", c = f.mouseFocus; c;) { | |
| if (c.buttonMode) { | |
| a = "pointer"; | |
| break | |
| } | |
| c = c.mother | |
| } | |
| this.canvas && (this.canvas.style.cursor = a); | |
| window.blur(); | |
| window.focus() | |
| }; | |
| this.onMouseDown = function(a) { | |
| f.mouseFocus && f.mouseFocus.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)) | |
| }; | |
| this.onMouseUp = function(a) { | |
| f.mouseFocus && f.mouseFocus.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP)) | |
| }; | |
| this.onMouseClick = function(a) { | |
| f.mouseFocus && f.mouseFocus.dispatchEvent(new MouseEvent(MouseEvent.CLICK)) | |
| }; | |
| this.onMouseOver = function(a) { | |
| f.canvas.onmousemove = f.onMouseMove; | |
| f.mouseOver = !0 | |
| }; | |
| this.onMouseOut = | |
| function(a) { | |
| if (f.mouseFocus) { | |
| a = f.mouseFocus.getAncestry(); | |
| for (var c = 0; c < a.length; c++) a[c].dispatchRollOut() | |
| } | |
| f.canvas.onmousemove = void 0; | |
| f.mouseFocus = !1; | |
| f.mouseOver = !1 | |
| }; | |
| this.onMouseMove = function(a) { | |
| f.layerX = void 0 == a.offsetX ? a.layerX : a.offsetX; | |
| f.layerY = void 0 == a.offsetY ? a.layerY : a.offsetY | |
| }; | |
| this.addChild = function(a) { | |
| this.children.push(a); | |
| a.setStage(this); | |
| a.mother = this | |
| }; | |
| this.removeChild = function(a) { | |
| var c = this.children.indexOf(a); | |
| if (-1 == c) throw a + " is not a child of " + this; | |
| this.children.splice(c, 1); | |
| a.setStage(null); | |
| a.mother = null | |
| }; | |
| this.addMouseColor = function(a) { | |
| this.mouseColors[a.mouseColor.getHexValue()] = a | |
| }; | |
| this.removeMouseColor = function(a) { | |
| delete this.mouseColors[a.mouseColor.getHexValue()] | |
| }; | |
| this.dispatchEvent = function(a) { | |
| Events.dispatch(this, a) | |
| }; | |
| this.addEventListener = function(a, c) { | |
| Events.addListener(this, a, c) | |
| }; | |
| this.removeEventListener = function(a, c) { | |
| Events.removeListener(this, a, c) | |
| }; | |
| this.dispatchRollOver = function() { | |
| !this.over && this.mouseEnabled && (this.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OVER)), this.over = !0) | |
| }; | |
| this.dispatchRollOut = function() { | |
| this.over && this.mouseEnabled && (this.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT)), this.over = !1) | |
| }; | |
| this.toString = function() { | |
| return "[object Stage]" | |
| }; | |
| this.__construct__() | |
| }; | |
| Stage.r = 0; | |
| Stage.g = 0; | |
| Stage.b = 0; | |
| Stage.uid = 0; | |
| Stage.renderEvent = new GlobalEvent(GlobalEvent.RENDER_FRAME); | |
| Stage.getUniqueID = function() { | |
| return ++Stage.uid | |
| }; | |
| Stage.getMouseColor = function() { | |
| Stage.r += 1; | |
| 255 < Stage.r && (Stage.r = 0, Stage.g++); | |
| 255 < Stage.g && (Stage.r = 0, Stage.g = 0, Stage.b++); | |
| return new Color(Stage.r, Stage.g, Stage.b) | |
| }; | |
| Stage.init = function(a) { | |
| Stage.framerate = a; | |
| a = Math.round(1E3 * (1 / a)); | |
| Stage.renderInterval = setInterval(Stage.renderFrame, a) | |
| }; | |
| Stage.renderFrame = function() { | |
| GlobalEvents.dispatch(Stage.renderEvent) | |
| }; | |
| Stage.suspend = function() { | |
| clearInterval(Stage.renderInterval) | |
| }; | |
| var Triangle = function(a, d, f, g, c, h) { | |
| var k = this; | |
| this.onscreen = h; | |
| this.shot = d; | |
| this.primaryColor = f; | |
| this.ctaColor = g; | |
| this.scale = c; | |
| this.img = new Image; | |
| this.stage = new Stage(a); | |
| this.triangleMask = null; | |
| this.isTapping = !1; | |
| this.touchStartPoint = { | |
| x: 0, | |
| y: 0 | |
| }; | |
| this.touchScreenPoint = { | |
| x: 0, | |
| y: 0 | |
| }; | |
| this.isLoaded = this.isAnimated = !1; | |
| this.__construct__ = function() { | |
| this.triangleMask = new TriangleMask(this.img, this.shot, this.primaryColor, this.ctaColor, this.scale); | |
| this.stage.scale = this.scale; | |
| this.stage.addChild(this.triangleMask); | |
| this.stage.render() | |
| }; | |
| this.load = function() { | |
| this.img.src = this.shot.images.hidpi || this.shot.images.normal || this.shot.images.teaser; | |
| this.img.onload = this.onload; | |
| this.isAnimated = /.gif/g.test(this.img.src) | |
| }; | |
| this.setOnscreen = function(a) { | |
| k.onscreen = a; | |
| k.isLoaded && (k.onscreen ? k.isAnimated && k.stage.startRendering() : k.stage.stopRendering()) | |
| }; | |
| this.onload = function() { | |
| k.onscreen ? (R.startRendering(), setTimeout(function() { | |
| k.stage.startRendering(); | |
| k.triangleMask.addEventListener("triangle_ready", k.triangleReady); | |
| k.triangleMask.fadeIn() | |
| }, | |
| 250)) : (k.triangleMask.drawImage = !0, k.triangleMask.scaleX = 1, k.triangleMask.scaleY = 1, k.triangleMask.blackAlpha = 0, k.stage.render(), k.finishLoad()) | |
| }; | |
| this.triangleReady = function() { | |
| k.isAnimated || k.stage.stopRendering(); | |
| k.finishLoad() | |
| }; | |
| this.finishLoad = function() { | |
| k.isLoaded = !0; | |
| GlobalEvents.dispatch({ | |
| name: "TriangleLoad", | |
| triangle: this | |
| }); | |
| k.triangleMask.addEventListener(TriangleMask.STOP_RENDERING, k.stopTriangle); | |
| k.triangleMask.addEventListener(TriangleMask.START_RENDERING, k.startTriangle); | |
| k.stage.canvas.addEventListener("touchstart", | |
| function(a) { | |
| k.isTapping = !0; | |
| k.touchStartPoint.x = a.touches[0].pageX; | |
| k.touchStartPoint.y = a.touches[0].pageY; | |
| k.touchScreenPoint.x = a.touches[0].clientX; | |
| k.touchScreenPoint.y = a.touches[0].clientY | |
| }, !1); | |
| k.stage.canvas.addEventListener("touchmove", function(a) { | |
| 5 < Math.abs(a.touches[0].pageX - k.touchStartPoint.x) && (k.isTapping = !1); | |
| 5 < Math.abs(a.touches[0].pageY - k.touchStartPoint.y) && (k.isTapping = !1); | |
| k.touchScreenPoint.x = a.touches[0].clientX; | |
| k.touchScreenPoint.y = a.touches[0].clientY | |
| }, !1); | |
| k.stage.canvas.addEventListener("touchend", | |
| function(a) { | |
| k.isTapping && (k.triangleMask.isTriangle ? k.triangleMask.toggle() : 180 < k.touchScreenPoint.y - k.stage.canvas.getBoundingClientRect().top ? (a.preventDefault(), window.open(k.shot.html_url)) : k.triangleMask.toggle()); | |
| k.isTapping = !1 | |
| }, !1); | |
| k.stage.canvas.addEventListener("mouseover", k.mouseOver, !1); | |
| k.stage.canvas.addEventListener("mouseout", k.mouseOut, !1); | |
| k.isAnimated && k.stage.startRendering() | |
| }; | |
| this.mouseOver = function() { | |
| k.over = !0; | |
| k.stopped = !1; | |
| k.stage.enableMouse(); | |
| k.stage.startRendering(); | |
| k.stage.mouseOver = !0 | |
| }; | |
| this.mouseOut = function() { | |
| k.over = !1; | |
| k.stopped ? (k.stage.disableMouse(), k.isAnimated || k.stage.stopRendering(), k.stage.mouseOver = !1) : k.triangleMask.rollOut() | |
| }; | |
| this.startTriangle = function(a) { | |
| k.stopped = !1; | |
| k.stage.enableMouse(); | |
| k.stage.startRendering(); | |
| k.stage.mouseOver = !0 | |
| }; | |
| this.stopTriangle = function(a) { | |
| k.stopped = !0; | |
| !1 == k.over && (k.stage.disableMouse(), k.isAnimated || k.stage.stopRendering(), k.stage.mouseOver = !1) | |
| }; | |
| this.__construct__() | |
| }; | |
| TriangleMask.prototype = new Sprite; | |
| TriangleMask.prototype.constructor = TriangleMask; | |
| TriangleMask.START_RENDERING = "triangle_start_rendering"; | |
| TriangleMask.STOP_RENDERING = "triangle_stop_rendering"; | |
| TriangleMask.READY = "triangle_ready"; | |
| function TriangleMask(a, d, f, g, c) { | |
| Sprite.call(this); | |
| var h = this; | |
| this.scale = c; | |
| this.img = a; | |
| this.shot = d; | |
| this.primaryColor = new Color(f); | |
| this.ctaColor = new Color(g); | |
| var k = 400 * c, | |
| l = 300 * c, | |
| n = 150 * c, | |
| p = 178 * c, | |
| r = 165 * c, | |
| q = 145 * c, | |
| s = 15 * c, | |
| w = 25 * c, | |
| t = 80.5 * c, | |
| u = -254 * c, | |
| v = -148 * c; | |
| this.__construct__ = function() { | |
| this.x = n; | |
| this.y = p; | |
| this.scaleY = this.scaleX = 0.8; | |
| this.width = 282 * c; | |
| this.height = 244 * c; | |
| this.buttonMode = this.mouseEnabled = !0; | |
| this.imageX = u; | |
| this.imageY = -p; | |
| this.maskAngle = 0; | |
| this.blackAlpha = this.maskScale = 1; | |
| this.cornerRadius = s; | |
| this.noTilt = !1; | |
| this.isTriangle = !0; | |
| this.rolledOver = this.toggling = this.drawImage = !1; | |
| this.icons = new Icons(this.shot, this.primaryColor, this.ctaColor, h.scale); | |
| this.icons.visible = !1; | |
| this.bottomBar = new BottomBar(this.primaryColor.getHex(), h.scale); | |
| this.bottomBar.visible = !1; | |
| this.bottomBar.x = -159 * this.scale; | |
| this.bottomBar.y = 100 * this.scale; | |
| this.addChild(this.icons); | |
| this.addChild(this.bottomBar); | |
| this.addListeners() | |
| }; | |
| this.addListeners = function() { | |
| this.addEventListener(MouseEvent.ROLL_OUT, this.rollOut); | |
| this.addEventListener(MouseEvent.ROLL_OVER, | |
| this.rollOver); | |
| this.addEventListener(MouseEvent.CLICK, this.toggle) | |
| }; | |
| this.getDistance = function(a, c) { | |
| var d = Math.pow; | |
| return Math.sqrt(d(c.x - a.x, 2) + d(c.y - a.y, 2)) | |
| }; | |
| this.getPointOnLine = function(a, c, d) { | |
| return new Point2D((1 - d) * a.x + d * c.x, (1 - d) * a.y + d * c.y) | |
| }; | |
| this.getPointOnCircle = function(a, c, d) { | |
| x = a.x + c * Math.cos(d); | |
| y = a.y + c * Math.sin(d); | |
| return { | |
| x: x, | |
| y: y | |
| } | |
| }; | |
| this.fadeIn = function() { | |
| this.drawImage = !0; | |
| new Tween(h, 300, { | |
| scaleX: 1, | |
| scaleY: 1, | |
| blackAlpha: 0, | |
| ease: Ease.easeOut.expo, | |
| onComplete: function() { | |
| h.dispatchEvent({ | |
| name: TriangleMask.READY, | |
| triangle: h | |
| }); | |
| h.blackAlpha = 0 | |
| } | |
| }) | |
| }; | |
| this.draw = function(a) { | |
| var c = this.width, | |
| d = this.height, | |
| f = this.cornerRadius; | |
| this.c2 = new Point2D(0, 0); | |
| this.c5 = new Point2D(c / 2, d); | |
| this.c8 = new Point2D(-c / 2, d); | |
| var c = this.c2, | |
| d = this.c5, | |
| g = this.c8; | |
| this.center = new Point2D((c.x + d.x + g.x) / 3, (c.y + d.y + g.y) / 3); | |
| c.y -= this.center.y; | |
| c.x -= this.center.x; | |
| d.y -= this.center.y; | |
| d.x -= this.center.x; | |
| g.y -= this.center.y; | |
| g.x -= this.center.x; | |
| var p = this.getDistance(c, d), | |
| n = this.getDistance(d, g), | |
| q = this.getDistance(g, c); | |
| this.c1 = this.getPointOnLine(g, c, (q - | |
| 1.75 * f) / q); | |
| this.c3 = this.getPointOnLine(d, c, (p - 1.75 * f) / p); | |
| this.c4 = this.getPointOnLine(c, d, (p - 1.75 * f) / p); | |
| this.c6 = this.getPointOnLine(g, d, (n - 1.75 * f) / n); | |
| this.c7 = this.getPointOnLine(d, g, (n - 1.75 * f) / n); | |
| this.c9 = this.getPointOnLine(c, g, (q - 1.75 * f) / q); | |
| this.rotateMask(this.maskAngle); | |
| h.drawTriangle(a); | |
| a.save(); | |
| a.clip(); | |
| h.drawImage && a.drawImage(this.img, this.imageX, this.imageY, k, l); | |
| a.fillStyle = "rgba(40,41,44," + this.blackAlpha + ")"; | |
| a.fillRect(-200 * h.scale, -180 * h.scale, 400 * h.scale, 300 * h.scale) | |
| }; | |
| this.afterDraw = function(a) { | |
| a.restore(); | |
| a.strokeStyle = "#eeeeee"; | |
| a.lineWidth = 1 * h.scale; | |
| a.stroke() | |
| }; | |
| this.drawPoints = function(a) { | |
| a.fillStyle = "#ff0000"; | |
| a.beginPath(); | |
| a.arc(this.c1.x, this.c1.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c4.x, this.c4.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c7.x, this.c7.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.fillStyle = "#00ff00"; | |
| a.beginPath(); | |
| a.arc(this.c2.x, this.c2.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c5.x, | |
| this.c5.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c8.x, this.c8.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.fillStyle = "#0000ff"; | |
| a.beginPath(); | |
| a.arc(this.c3.x, this.c3.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c6.x, this.c6.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill(); | |
| a.beginPath(); | |
| a.arc(this.c9.x, this.c9.y, 3 * this.scale, 0, 2 * Math.PI); | |
| a.closePath(); | |
| a.fill() | |
| }; | |
| this.drawTriangle = function(a) { | |
| var c = this.cornerRadius; | |
| a.beginPath(); | |
| a.moveTo(this.c1.x, this.c1.y); | |
| a.arcTo(this.c2.x, this.c2.y, this.c3.x, this.c3.y, c); | |
| a.lineTo(this.c4.x, this.c4.y); | |
| a.arcTo(this.c5.x, this.c5.y, this.c6.x, this.c6.y, c); | |
| a.lineTo(this.c7.x, this.c7.y); | |
| a.arcTo(this.c8.x, this.c8.y, this.c9.x, this.c9.y, c); | |
| a.lineTo(this.c1.x, this.c1.y); | |
| a.closePath() | |
| }; | |
| this.mouseDraw = function(a) { | |
| a.beginPath(); | |
| a.fillStyle = "#00ff00"; | |
| a.rect(-h.x, -h.y, 300 * this.scale, 300 * this.scale); | |
| a.closePath(); | |
| a.fill(); | |
| h.rolledOver && h.isTriangle && (a.lineWidth = 25 * this.scale); | |
| a.fillStyle = this.mouseString; | |
| a.strokeStyle = this.mouseString; | |
| this.drawTriangle(a); | |
| a.fill(); | |
| a.stroke(); | |
| a.lineWidth = 0 | |
| }; | |
| this.rotateMask = function(a) { | |
| a = a * Math.PI / 180; | |
| this.c1.rotate(a); | |
| this.c2.rotate(a); | |
| this.c3.rotate(a); | |
| this.c4.rotate(a); | |
| this.c5.rotate(a); | |
| this.c6.rotate(a); | |
| this.c7.rotate(a); | |
| this.c8.rotate(a); | |
| this.c9.rotate(a) | |
| }; | |
| this.circleMorph = function() { | |
| h.cornerTween && h.cornerTween.stop(); | |
| h.spinTween && h.spinTween.stop(); | |
| h.tiltTween && h.tiltTween.stop(); | |
| h.icons.show(); | |
| h.icons.visible = !0; | |
| h.isTriangle = !1; | |
| h.cornerTween = new Tween(h, 800, { | |
| cornerRadius: t, | |
| ease: Ease.easeInOut.expo | |
| }); | |
| h.spinTween = new Tween(h, 800, { | |
| y: q, | |
| scaleX: 1.5, | |
| scaleY: 1.5, | |
| blackAlpha: 1, | |
| rotation: 90, | |
| ease: Ease.easeInOut.back, | |
| onComplete: function() { | |
| h.y = q; | |
| h.scaleX = 1.5; | |
| h.scaleY = 1.5; | |
| h.imageX = u; | |
| h.imageY = -q; | |
| h.rotation = 90; | |
| h.maskAngle = 0; | |
| h.blackAlpha = 1; | |
| h.drawImage = !1; | |
| h.toggling = !1 | |
| } | |
| }) | |
| }; | |
| this.triangleMorph = function() { | |
| h.tiltTween && h.tiltTween.stop(); | |
| h.cornerTween && h.cornerTween.stop(); | |
| h.spinTween && h.spinTween.stop(); | |
| h.maskAngle = 0; | |
| h.imageX = u; | |
| h.imageY = -p; | |
| h.cornerTween = new Tween(h, 800, { | |
| delay: 200, | |
| cornerRadius: s, | |
| ease: Ease.easeInOut.expo | |
| }); | |
| h.spinTween = new Tween(h, 800, { | |
| y: p, | |
| scaleX: 1, | |
| scaleY: 1, | |
| delay: 200, | |
| blackAlpha: 0, | |
| rotation: 0, | |
| ease: Ease.easeInOut.back, | |
| onComplete: function() { | |
| h.y = p; | |
| h.rotation = 0; | |
| h.blackAlpha = 0; | |
| h.scaleX = 1; | |
| h.scaleY = 1; | |
| h.dispatchEvent({ | |
| name: TriangleMask.STOP_RENDERING, | |
| triangle: h | |
| }); | |
| h.icons.visible = !1; | |
| h.isTriangle = !0; | |
| h.toggling = !1 | |
| } | |
| }); | |
| h.icons.hide(); | |
| h.drawImage = !0 | |
| }; | |
| this.toggle = function() { | |
| if (h.toggling) return !1; | |
| h.toggling = !0; | |
| h.dispatchEvent({ | |
| name: TriangleMask.START_RENDERING, | |
| triangle: h | |
| }); | |
| h.isTriangle ? | |
| (h.circleMorph(), h.buttonMode = !1, GlobalEvents.dispatch(new GlobalEvent(GlobalEvent.EVAL_MOUSE)), GlobalEvents.dispatch({ | |
| name: "TriangleToggleIn", | |
| triangle: h | |
| })) : (h.triangleMorph(), h.buttonMode = !0, GlobalEvents.dispatch(new GlobalEvent(GlobalEvent.EVAL_MOUSE)), GlobalEvents.dispatch({ | |
| name: "TriangleToggleOut", | |
| triangle: h | |
| })); | |
| h.barTween && h.barTween.stop(); | |
| h.barTween = new Tween(h.bottomBar, 400, { | |
| rotation: 20, | |
| y: 100 * h.scale, | |
| ease: Ease.easeOut.quint | |
| }); | |
| h.bottomBar.hide() | |
| }; | |
| this.rollOver = function() { | |
| if (!h.isTriangle || h.toggling) return !1; | |
| h.out = !1; | |
| h.rolledOver = !0; | |
| h.dispatchEvent({ | |
| name: TriangleMask.START_RENDERING, | |
| triangle: h | |
| }); | |
| h.tiltTween && h.tiltTween.stop(); | |
| h.tiltTween = new Tween(h, 600, { | |
| maskAngle: 10, | |
| cornerRadius: w, | |
| y: r, | |
| imageY: -r, | |
| ease: Ease.easeOut.quint, | |
| onComplete: function() {} | |
| }); | |
| h.imageTween && h.imageTween.stop(); | |
| h.imageTween = new Tween(h, 800, { | |
| imageX: v, | |
| ease: Ease.easeOut.quint, | |
| onComplete: function() {} | |
| }); | |
| h.barTween && h.barTween.stop(); | |
| h.barTween = new Tween(h.bottomBar, 400, { | |
| rotation: 0, | |
| y: 30 * h.scale, | |
| ease: Ease.easeOut.quint | |
| }); | |
| h.bottomBar.visible = !0; | |
| h.bottomBar.show() | |
| }; | |
| this.rollOut = function() { | |
| if (!h.isTriangle || h.toggling || h.out) return !1; | |
| h.out = !0; | |
| h.rolledOver = !1; | |
| h.dispatchEvent({ | |
| name: TriangleMask.START_RENDERING, | |
| triangle: h | |
| }); | |
| h.tiltTween && h.tiltTween.stop(); | |
| h.tiltTween = new Tween(h, 600, { | |
| maskAngle: 0, | |
| cornerRadius: s, | |
| y: p, | |
| imageY: -p, | |
| ease: Ease.easeOut.quint, | |
| onUpdate: function() {}, | |
| onComplete: function() {} | |
| }); | |
| h.imageTween && h.imageTween.stop(); | |
| h.imageTween = new Tween(h, 800, { | |
| imageX: u, | |
| ease: Ease.easeOut.quint, | |
| onComplete: function() { | |
| h.dispatchEvent({ | |
| name: TriangleMask.STOP_RENDERING, | |
| triangle: h | |
| }); | |
| h.bottomBar.visible = !1; | |
| h.out = !1 | |
| } | |
| }); | |
| h.barTween && h.barTween.stop(); | |
| h.barTween = new Tween(h.bottomBar, 400, { | |
| rotation: 20, | |
| y: 100 * h.scale, | |
| ease: Ease.easeIn.quint | |
| }); | |
| h.bottomBar.hide() | |
| }; | |
| this.toString = function() { | |
| return "[Sprite TriangleMask]" | |
| }; | |
| this.__construct__() | |
| }; | |
| Icons.prototype = new Sprite; | |
| Icons.prototype.constructor = Icons; | |
| function Icons(a, d, f, g) { | |
| Sprite.call(this); | |
| var c = this; | |
| this.scale = g; | |
| this.shot = a; | |
| this.primaryColor = d; | |
| this.ctaColor = f; | |
| this.viewTotal = a.views_count; | |
| this.likeTotal = a.likes_count; | |
| var h = 71 * g, | |
| k = 136 * g, | |
| l = -89 * g, | |
| n = -154 * g, | |
| p = 28 * g, | |
| r = -16 * g, | |
| q = 44 * g, | |
| s = 8 * g, | |
| w = -74 * g, | |
| t = -16 * g, | |
| u = 48 * g, | |
| v = 8 * g, | |
| z = -21 * g, | |
| C = 43 * g, | |
| D = 35 * g; | |
| this.count = { | |
| likes: 0, | |
| views: 0 | |
| }; | |
| this.__construct__ = function() { | |
| this.alpha = 0; | |
| this.iconsY = n; | |
| this.rotation = -180; | |
| this.scaleX = 1 / 1.5; | |
| this.scaleY = 1 / 1.5; | |
| this.views = new Image; | |
| this.likes = new Image; | |
| this.statsIcons = new Image; | |
| 1 < c.scale ? | |
| (this.views.src = STATIC_URL + "img/case-studies/common/[email protected]", this.likes.src = STATIC_URL + "img/case-studies/common/[email protected]", this.statsIcons.src = STATIC_URL + "img/case-studies/common/[email protected]") : (this.views.src = STATIC_URL + "img/case-studies/common/dribbble-views.png", this.likes.src = STATIC_URL + "img/case-studies/common/dribbble-likes.png", this.statsIcons.src = STATIC_URL + "img/case-studies/common/dribbble-stats-icons.png"); | |
| this.likeCount = new CountText("0", "center", | |
| g); | |
| this.likeCount.x = 50 * c.scale; | |
| this.likeCount.y = 24 * c.scale; | |
| this.viewCount = new CountText("0", "center", g); | |
| this.viewCount.x = -50 * c.scale; | |
| this.viewCount.y = 24 * c.scale; | |
| this.dribbbleLink = new DribbbleLink(this.shot, this.primaryColor, this.ctaColor, this.scale); | |
| this.dribbbleLink.x = -123 * c.scale; | |
| this.dribbbleLink.y = k; | |
| this.addChild(this.likeCount); | |
| this.addChild(this.viewCount); | |
| this.addChild(this.dribbbleLink) | |
| }; | |
| this.addListeners = function() {}; | |
| this.draw = function(a) { | |
| a.drawImage(this.likes, p, r, q, s); | |
| a.drawImage(this.views, | |
| w, t, u, v); | |
| a.drawImage(this.statsIcons, z, this.iconsY, C, D) | |
| }; | |
| this.mouseDraw = function(a) {}; | |
| this.countUp = function() { | |
| c.countTween && c.countTween.stop(); | |
| c.count = { | |
| likes: 0, | |
| feedback: 0, | |
| views: 0 | |
| }; | |
| c.likeCount.text = "0"; | |
| c.viewCount.text = "0"; | |
| c.countTween = new Tween(c.count, 800, { | |
| delay: 400, | |
| likes: c.likeTotal, | |
| feedback: c.feedbackTotal, | |
| views: c.viewTotal, | |
| ease: Ease.easeOut.sine, | |
| onUpdate: function() { | |
| c.likeCount.text = Math.round(c.count.likes) + ""; | |
| c.viewCount.text = Math.round(c.count.views) + "" | |
| } | |
| }) | |
| }; | |
| this.show = function() { | |
| c.showTween && | |
| c.showTween.stop(); | |
| c.dribbbleLink.show(); | |
| c.showTween = new Tween(c, 800, { | |
| rotation: -90, | |
| alpha: 1, | |
| iconsY: l, | |
| ease: Ease.easeOut.quint, | |
| delay: 600, | |
| onUpdate: function() { | |
| c.likeCount.textAlpha = c.alpha; | |
| c.viewCount.textAlpha = c.alpha; | |
| c.dribbbleLink.y = k + (h - k) * c.alpha | |
| }, | |
| onComplete: function() {} | |
| }); | |
| c.countUp() | |
| }; | |
| this.hide = function() { | |
| c.showTween && c.showTween.stop(); | |
| c.dribbbleLink.hide(); | |
| c.showTween = new Tween(c, 800, { | |
| alpha: 0, | |
| rotation: -180, | |
| iconsY: n, | |
| ease: Ease.easeOut.quint, | |
| onUpdate: function() { | |
| c.likeCount.textAlpha = c.alpha; | |
| c.viewCount.textAlpha = | |
| c.alpha; | |
| c.dribbbleLink.y = k + (h - k) * c.alpha | |
| }, | |
| onComplete: function() { | |
| c.alpha = 0 | |
| } | |
| }) | |
| }; | |
| this.toString = function() { | |
| return "[Sprite Icons]" | |
| }; | |
| this.__construct__() | |
| }; | |
| CountText.prototype = new Sprite; | |
| CountText.prototype.constructor = CountText; | |
| function CountText(a, d, f) { | |
| Sprite.call(this); | |
| this.scale = f; | |
| this.text = a; | |
| this.align = d; | |
| this.textAlpha = 0; | |
| var g = 26 * f; | |
| this.__construct__ = function() {}; | |
| this.addListeners = function() {}; | |
| this.draw = function(a) { | |
| a.font = "bold " + g + "px 'Futura Bold'"; | |
| var d = a.measureText(this.text).width, | |
| f = 0; | |
| "left" == this.align ? f = 0 : "right" == this.align ? f = -d : "center" == this.align && (f = -d / 2); | |
| a.fillStyle = "rgba(255,255,255," + Math.round(100 * this.textAlpha) / 100 + ")"; | |
| a.fillText(this.text, f, 0) | |
| }; | |
| this.mouseDraw = function(a) {}; | |
| this.show = function() {}; | |
| this.hide = function() {}; | |
| this.toString = function() { | |
| return "[sprite CountText]" | |
| }; | |
| this.__construct__() | |
| }; | |
| DribbbleLink.prototype = new Sprite; | |
| DribbbleLink.prototype.constructor = DribbbleLink; | |
| function DribbbleLink(a, d, f, g) { | |
| Sprite.call(this); | |
| var c = this; | |
| this.scale = g; | |
| this.shot = a; | |
| this.buttonMode = !0; | |
| this.ctaAlpha = 0; | |
| var h = 113 * g, | |
| k = 17 * g, | |
| l = 20 * g, | |
| n = 12 * g; | |
| this.__construct__ = function() { | |
| this.mouseEnabled = !0; | |
| this.cta = new Image; | |
| this.cta.src = 1 < c.scale ? STATIC_URL + "img/case-studies/common/[email protected]" : STATIC_URL + "img/case-studies/common/dribbble-arrow.png" | |
| }; | |
| this.addListeners = function() { | |
| this.addEventListener(MouseEvent.ROLL_OVER, this.rollOver); | |
| this.addEventListener(MouseEvent.ROLL_OUT, this.rollOut); | |
| this.addEventListener(MouseEvent.CLICK, this.click) | |
| }; | |
| this.removeListeners = function() { | |
| this.removeEventListener(MouseEvent.ROLL_OVER, this.rollOver); | |
| this.removeEventListener(MouseEvent.ROLL_OUT, this.rollOut); | |
| this.removeEventListener(MouseEvent.CLICK, this.click) | |
| }; | |
| this.draw = function(a) { | |
| a.fillStyle = "rgba(60, 61, 64, " + Math.round(100 * Math.min(c.ctaAlpha / 0.4, 1)) / 100 + ")"; | |
| a.fillRect(0, 0, 246 * c.scale, 1 * c.scale); | |
| a.fillStyle = "rgba(32, 33, 35, " + Math.round(100 * Math.max((c.ctaAlpha - 0.4) / 0.6, 0)) / 100 + ")"; | |
| a.fillRect(0, | |
| 1 * c.scale, 246 * c.scale, 54 * c.scale); | |
| a.save(); | |
| a.globalAlpha = c.ctaAlpha; | |
| a.drawImage(this.cta, h, k, l, n); | |
| a.restore() | |
| }; | |
| this.mouseDraw = function(a) { | |
| a.fillStyle = c.mouseString; | |
| a.beginPath(); | |
| a.arc(123 * c.scale, -71 * c.scale, 125 * c.scale, 34.1 * Math.PI / 180, 145.9 * Math.PI / 180); | |
| a.closePath(); | |
| a.fill() | |
| }; | |
| this.show = function() { | |
| c.showTween && c.showTween.stop(); | |
| c.showTween = new Tween(c, 400, { | |
| ctaAlpha: 0.4, | |
| delay: 300, | |
| ease: Ease.easeOut.sine, | |
| onComplete: function() { | |
| c.addListeners() | |
| } | |
| }) | |
| }; | |
| this.hide = function() { | |
| c.removeListeners(); | |
| c.showTween && | |
| c.showTween.stop(); | |
| c.showTween = new Tween(c, 400, { | |
| ctaAlpha: 0, | |
| ease: Ease.easeOut.sine | |
| }) | |
| }; | |
| this.rollOver = function() { | |
| c.showTween && c.showTween.stop(); | |
| c.showTween = new Tween(c, 400, { | |
| ctaAlpha: 1, | |
| ease: Ease.easeOut.sine | |
| }) | |
| }; | |
| this.rollOut = function() { | |
| c.showTween && c.showTween.stop(); | |
| c.showTween = new Tween(c, 400, { | |
| ctaAlpha: 0.4, | |
| ease: Ease.easeOut.sine | |
| }) | |
| }; | |
| this.click = function() { | |
| window.open(c.shot.html_url) | |
| }; | |
| this.toString = function() { | |
| return "[Sprite DribbleLink]" | |
| }; | |
| this.__construct__() | |
| }; | |
| BottomBar.prototype = new Sprite; | |
| BottomBar.prototype.constructor = BottomBar; | |
| function BottomBar(a, d) { | |
| Sprite.call(this); | |
| var f = this; | |
| this.scale = d; | |
| this.__construct__ = function(a) { | |
| this.color = a; | |
| this.rotation = 20; | |
| var c = new Image; | |
| c.src = 1 < f.scale ? STATIC_URL + "img/case-studies/common/[email protected]" : STATIC_URL + "img/case-studies/common/dribbble-stats-cta.png"; | |
| this.explore = new Sprite; | |
| this.explore.draw = function(a) { | |
| a.drawImage(c, 0, 0, 131 * f.scale, 12 * f.scale) | |
| }; | |
| this.addChild(this.explore); | |
| this.explore.x = 114 * f.scale; | |
| this.explore.y = 17 * f.scale | |
| }; | |
| this.addListeners = function() {}; | |
| this.draw = | |
| function(a) { | |
| a.fillStyle = this.color; | |
| a.fillRect(0, 0, 318 * f.scale, 67 * f.scale) | |
| }; | |
| this.mouseDraw = function(a) { | |
| a.fillStyle = f.mouseString; | |
| a.fillRect(0, 0, 318 * f.scale, 67 * f.scale) | |
| }; | |
| this.show = function() { | |
| this.showTween && this.showTween.stop(); | |
| this.showTween = new Tween(this.explore, 400, { | |
| alpha: 1, | |
| ease: Ease.easeOut.sine | |
| }) | |
| }; | |
| this.hide = function() { | |
| this.showTween && this.showTween.stop(); | |
| this.showTween = new Tween(this.explore, 400, { | |
| alpha: 0, | |
| ease: Ease.easeOut.sine | |
| }) | |
| }; | |
| this.toString = function() { | |
| return "[Sprite BottomBar]" | |
| }; | |
| this.__construct__(a) | |
| }; | |
| var TapBio = function(a) { | |
| var d = this; | |
| this.element = a; | |
| this.touchStartPoint = { | |
| x: 0, | |
| y: 0 | |
| }; | |
| this.isTouchMoving = this.isTapping = !1; | |
| this.toggleOn = function() { | |
| R.addClass(d.element, "toggled") | |
| }; | |
| this.toggleOff = function() { | |
| R.removeClass(d.element, "toggled") | |
| }; | |
| (function() { | |
| d.element.addEventListener("touchstart", function(a) { | |
| d.isTouchMoving = !0; | |
| d.isTapping = !0; | |
| d.touchStartPoint.x = a.touches[0].pageX; | |
| d.touchStartPoint.y = a.touches[0].pageY; | |
| R.addClass(d.element.parentNode, "no-hover") | |
| }, !1); | |
| d.element.addEventListener("touchmove", | |
| function(a) { | |
| d.isTouchMoving = !0; | |
| 5 < Math.abs(a.touches[0].pageX - d.touchStartPoint.x) && (d.isTapping = !1); | |
| 5 < Math.abs(a.touches[0].pageY - d.touchStartPoint.y) && (d.isTapping = !1) | |
| }, !1); | |
| d.element.addEventListener("touchend", function(a) { | |
| d.isTapping && (R.hasClass(d.element, "toggled") ? (R.removeClass(d.element, "toggled"), GlobalEvents.dispatch({ | |
| name: "bio_toggled_off", | |
| bio: d | |
| })) : (R.addClass(d.element, "toggled"), GlobalEvents.dispatch({ | |
| name: "bio_toggled_on", | |
| bio: d | |
| }))); | |
| d.isTapping = !1 | |
| }, !1); | |
| d.element.addEventListener("mousemove", | |
| function(a) { | |
| d.isTouchMoving || R.removeClass(d.element.parentNode, "no-hover"); | |
| d.isTouchMoving = !1 | |
| }, !1) | |
| })() | |
| }; | |
| var TapBios = function(a) { | |
| var d = this; | |
| this.elements = a; | |
| this.currentBio = null; | |
| (function() { | |
| for (var a = d.elements.length - 1; 0 <= a; a--) new TapBio(d.elements[a]); | |
| GlobalEvents.addListener("bio_toggled_on", function(a) { | |
| d.currentBio && d.currentBio != a.bio && d.currentBio.toggleOff(); | |
| d.currentBio = a.bio | |
| }); | |
| GlobalEvents.addListener("bio_toggled_off", function(a) { | |
| d.currentBio = null | |
| }) | |
| })() | |
| }; | |
| var TapNonHoverable = function(a) { | |
| var d = this; | |
| this.element = a; | |
| this.isTouchMoving = !1; | |
| (function() { | |
| d.element.addEventListener("touchstart", function(a) { | |
| d.isTouchMoving = !0; | |
| R.addClass(d.element.parentNode, "no-hover") | |
| }, !1); | |
| d.element.addEventListener("touchmove", function(a) { | |
| d.isTouchMoving = !0 | |
| }, !1); | |
| d.element.addEventListener("mousemove", function(a) { | |
| d.isTouchMoving || R.removeClass(d.element.parentNode, "no-hover"); | |
| d.isTouchMoving = !1 | |
| }, !1) | |
| })() | |
| }; | |
| R.Slideshow = function() { | |
| var a = this; | |
| this.html = {}; | |
| this.dragHelper = null; | |
| this.animating = !1; | |
| this.videoPlayers = []; | |
| var d = 0, | |
| f = 0, | |
| g = 0, | |
| c = void 0, | |
| h = !1, | |
| k = !1, | |
| l = !1, | |
| n = 768 < window.innerWidth; | |
| this.init = function(a) { | |
| this.html.containerDiv = a; | |
| this.html.containerDiv.slideshow = this; | |
| this.html.screenshotsDiv = a.querySelector(".screenshots"); | |
| this.html.screenshotDivs = a.querySelectorAll(".screenshot"); | |
| this.html.screenshotCaptionDivs = a.querySelectorAll(".screenshot-caption"); | |
| for (var c = 0; c < this.html.screenshotDivs.length; c++) { | |
| var d = | |
| this.html.screenshotDivs[c].querySelector(".video-player"); | |
| d ? this.videoPlayers.push((new R.VideoPlayer).init(d, this)) : this.videoPlayers.push(null) | |
| } | |
| var f = a.querySelector(".device-aux-content .device-screen"); | |
| f.innerHTML = this.html.screenshotsDiv.outerHTML; | |
| this.html.bgScreenshotsDiv = f.querySelector(".screenshots"); | |
| this.html.slideshowControlsDiv = a.querySelector(".slideshow-controls"); | |
| this.html.slideshowCaptionDiv = a.querySelector(".slideshow-caption"); | |
| this.html.slideshowCaptionOuterDiv = a.querySelector(".slideshow-caption-outer"); | |
| this.html.slideshowCaptionInnerDiv = a.querySelector(".slideshow-caption-inner"); | |
| this.html.slideshowCaptionContentDiv = a.querySelector(".slideshow-caption-content"); | |
| this.html.slideshowCaptionContinueSpan = a.querySelector(".slideshow-caption-continue"); | |
| this.html.slideshowCaptionContinueSpan.innerHTML = "...continue"; | |
| this.html.paginationBarDiv = a.querySelector(".pagination-bar"); | |
| this.html.paginationBarOuterDiv = a.querySelector(".pagination-bar-outer"); | |
| this.html.paginationBarInnerDiv = a.querySelector(".pagination-bar-inner"); | |
| this.html.paginationBarContentDiv = a.querySelector(".pagination-bar-content"); | |
| this.html.paginationBarHandleDiv = a.querySelector(".pagination-bar-handle"); | |
| this.html.slideshowCaptionContentDiv.innerHTML = this.html.screenshotCaptionDivs[0].innerHTML; | |
| this.html.slideshowCaptionContentDiv.querySelector(".caption-text p").appendChild(this.html.slideshowCaptionContinueSpan); | |
| this.dragHelper = (new DragHelper).init(); | |
| this.dragHelper.getDimensionX = function() { | |
| return f.clientWidth | |
| }; | |
| return this | |
| }; | |
| this.onDrag = function(c, | |
| g, h, k, n, t) { | |
| d = c; | |
| (!l && 5 < c || -5 > c) && a.hideCaption(); | |
| k = f - c / a.html.screenshotsDiv.clientWidth; | |
| c = 1 - 1 / a.html.screenshotDivs.length; | |
| g = 1 - 1 / a.html.screenshotDivs.length / 3; | |
| h = -1 / a.html.screenshotDivs.length / 1.5; | |
| k > c ? (k = (k - c) * a.html.screenshotsDiv.clientWidth, k = Math.min(k / (window.innerWidth / 2), 1), k = c + (g - c) * k) : 0 > k && (k = (0 - k) * a.html.screenshotsDiv.clientWidth, k = Math.min(k / (window.innerWidth / 2), 1), k *= h); | |
| R.setTransform(a.html.screenshotsDiv, "translate3d(" + -100 * k + "%,0,0)"); | |
| R.setTransform(a.html.bgScreenshotsDiv, "translate3d(" + | |
| -100 * k + "%,0,0)"); | |
| R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * k + "%,0,0)"); | |
| return !1 | |
| }; | |
| this.onDragComplete = function(c, h) { | |
| if (c != DragHelper.OUTCOME_CLICK) { | |
| var k = this.html.screenshotDivs.length, | |
| l = Math.ceil((f - d / this.html.screenshotsDiv.clientWidth) * k); | |
| switch (c) { | |
| case DragHelper.OUTCOME_BACK: | |
| l -= 1 | |
| } | |
| g = l = Math.max(Math.min(l, k - 1), 0); | |
| k = g / k; | |
| f - d / a.html.screenshotsDiv.clientWidth != k && (R.setTransition(a.html.screenshotsDiv, "transform .2s ease-out"), R.setTransform(a.html.screenshotsDiv, "translate3d(" + | |
| -100 * k + "%,0,0)"), R.setTransition(a.html.bgScreenshotsDiv, "transform .2s ease-out"), R.setTransform(a.html.bgScreenshotsDiv, "translate3d(" + -100 * k + "%,0,0)"), R.setTransition(a.html.paginationBarContentDiv, "transform .2s ease-out"), R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * k + "%,0,0)"), this.animating = !0, R.onTransitionEnd(a.html.paginationBarContentDiv, function() { | |
| a.animating = !1 | |
| })); | |
| a.hideCaption(function() { | |
| a.html.slideshowCaptionContentDiv.innerHTML = a.html.screenshotCaptionDivs[g].innerHTML; | |
| a.html.slideshowCaptionContentDiv.querySelector(".caption-text p").appendChild(a.html.slideshowCaptionContinueSpan); | |
| a.showCaption() | |
| }); | |
| f = k | |
| } | |
| }; | |
| this.activate = function() { | |
| this.addListeners() | |
| }; | |
| this.deactivate = function() { | |
| this.removeListeners() | |
| }; | |
| this.addListeners = function() { | |
| this.html.containerDiv[R.touch ? "ontouchstart" : "onmousedown"] = function(c) { | |
| a.dragHelper.start(c); | |
| a.dragHelper.onDrag = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onIntentClear = a.dragIntentClear; | |
| c.stopPropagation() | |
| }; | |
| this.html.slideshowCaptionDiv.onclick = | |
| this.captionClick.bind(this); | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_RESIZE, this.onResize.bind(this)) | |
| }; | |
| this.removeListeners = function() { | |
| this.html.containerDiv[R.touch ? "ontouchstart" : "onmousedown"] = void 0; | |
| this.html.slideshowCaptionDiv.onclick = void 0; | |
| GlobalEvents.removeListener(GlobalEvent.WINDOW_RESIZE, this.onResize.bind(this)) | |
| }; | |
| this.showCaption = function(d) { | |
| c = void 0; | |
| l = k = !1; | |
| a.html.slideshowCaptionDiv.style.opacity = "1" | |
| }; | |
| this.hideCaption = function(d) { | |
| l ? d && d() : (c = d, k || (k = !0, R.setTransition(a.html.slideshowCaptionDiv, | |
| "opacity .2s linear"), a.html.slideshowCaptionDiv.style.opacity = 0, R.onTransitionEnd(a.html.slideshowCaptionDiv, function() { | |
| k = !1; | |
| l = !0; | |
| h = !1; | |
| R.setTransition(a.html.slideshowCaptionInnerDiv, ""); | |
| R.setTransform(a.html.slideshowCaptionInnerDiv, ""); | |
| n || (R.setTransition(a.html.slideshowCaptionContinueSpan, ""), a.html.slideshowCaptionContinueSpan.style.display = "block", a.html.slideshowCaptionContinueSpan.style.opacity = "1"); | |
| c && (c(), c = void 0) | |
| }))) | |
| }; | |
| this.expandCaption = function() { | |
| var c = a.html.slideshowCaptionContentDiv.querySelector(".caption-text"); | |
| a.html.slideshowCaptionContentDiv.querySelector(".caption-text-content"); | |
| c = c.scrollHeight - c.clientHeight; | |
| R.setTransition(this.html.slideshowCaptionInnerDiv, "transform .25s ease-out"); | |
| R.setTransform(this.html.slideshowCaptionInnerDiv, "translate3d(0," + -c + "px,0)"); | |
| a.html.slideshowControlsDiv.style.zIndex = "1"; | |
| R.setTransition(a.html.slideshowCaptionContinueSpan, ""); | |
| a.html.slideshowCaptionContinueSpan.style.display = "none"; | |
| a.html.slideshowCaptionContinueSpan.style.opacity = "0" | |
| }; | |
| this.collapseCaption = function() { | |
| R.setTransition(this.html.slideshowCaptionInnerDiv, | |
| "transform .25s ease-out"); | |
| R.setTransform(this.html.slideshowCaptionInnerDiv, "translate3d(0,0,0)"); | |
| R.onTransitionEnd(this.html.slideshowCaptionInnerDiv, function() { | |
| h || (a.html.slideshowCaptionContinueSpan.style.display = "", R.setTransition(a.html.slideshowCaptionContinueSpan, "opacity .15s linear"), a.html.slideshowCaptionContinueSpan.style.opacity = "1", a.html.slideshowControlsDiv.style.zIndex = "") | |
| }) | |
| }; | |
| this.captionClick = function(a) { | |
| n || (h ? this.collapseCaption() : this.expandCaption(), h = !h) | |
| }; | |
| this.stopVideoPlayers = | |
| function() { | |
| for (var a = 0; a < this.videoPlayers.length; a++) { | |
| var c = this.videoPlayers[a]; | |
| c && c.stop() | |
| } | |
| }; | |
| this.dragIntentClear = function(c) { | |
| a.animating || (a.stopVideoPlayers(), c == DragHelper.DRAG_DIRECTION_X ? (R.setTransition(a.html.screenshotsDiv, ""), R.setTransition(a.html.bgScreenshotsDiv, ""), R.setTransition(a.html.paginationBarContentDiv, ""), a.dragHelper.onDrag = a.onDrag.bind(a), a.dragHelper.onComplete = a.onDragComplete.bind(a), a.dragHelper.onIntentClear = void 0) : (a.dragHelper.onDrag = void 0, a.dragHelper.onComplete = | |
| void 0, a.dragHelper.onIntentClear = void 0, a.dragHelper.stop())) | |
| }; | |
| this.onResize = function() { | |
| 768 > window.innerWidth && n ? (n = !1, this.reset()) : 768 < window.innerWidth && !n && (n = !0, this.reset()) | |
| }; | |
| this.reset = function() { | |
| h = l = k = !1; | |
| c = void 0; | |
| a.html.slideshowCaptionContinueSpan.style.display = ""; | |
| a.html.slideshowCaptionContinueSpan.style.opacity = "1"; | |
| R.setTransition(this.html.slideshowCaptionInnerDiv, ""); | |
| R.setTransform(this.html.slideshowCaptionInnerDiv, "") | |
| } | |
| }; | |
| R.VideoPlayer = function() { | |
| var a = this; | |
| this.html = {}; | |
| this.loaded = this.loading = this.playing = !1; | |
| this.init = function(a, f) { | |
| this.delegate = f; | |
| a.videoPlayer = this; | |
| this.html.containerDiv = a; | |
| this.html.overlayDiv = a.querySelector(".video-player-overlay"); | |
| this.html.playLink = this.html.overlayDiv.querySelector("a"); | |
| this.videoUrl = a.getAttribute("data-video-url"); | |
| this.html.videoElement = document.createElement("video"); | |
| this.html.videoImg = a.querySelector("img"); | |
| this.addListeners(); | |
| return this | |
| }; | |
| this.addListeners = function() { | |
| this.html.playLink.onclick = | |
| this.playLinkClick.bind(this); | |
| this.delegate || (this.html.overlayDiv.ontouchstart = function(a) { | |
| a.stopPropagation() | |
| }); | |
| R.touch ? this.html.videoElement.addEventListener("webkitendfullscreen", this.videoEnded, !1) : this.html.videoElement.onended = this.videoEnded | |
| }; | |
| this.playLinkClick = function(a) { | |
| this.toggle(); | |
| return !1 | |
| }; | |
| this.videoEnded = function(d) { | |
| a.stop() | |
| }; | |
| this.loadVideo = function(a) { | |
| this.html.videoElement.canPlayType("video/mp4") || (this.videoUrl = this.videoUrl.replace(/\.mov$/, ".ogg")); | |
| this.html.videoElement.src = | |
| this.videoUrl; | |
| this.html.videoElement.load(); | |
| this.html.videoElement.onloadeddata = function() { | |
| a && a() | |
| } | |
| }; | |
| this.stop = function() { | |
| R.removeClass(this.html.overlayDiv, "playing"); | |
| R.removeClass(this.html.overlayDiv, "loading"); | |
| this.html.videoImg.style.display = ""; | |
| this.html.videoElement.onloadeddata = void 0; | |
| this.html.videoElement.removeEventListener("webkitendfullscreen", this.videoEnded); | |
| this.html.videoElement.parentNode && this.html.videoElement.parentNode.removeChild(this.html.videoElement); | |
| this.html.videoElement.pause(); | |
| this.html.videoElement.currentTime = 0; | |
| this.playing = !1 | |
| }; | |
| this.play = function() { | |
| this.playing || (R.addClass(a.html.overlayDiv, "loading"), this.loadVideo(function() { | |
| R.removeClass(a.html.overlayDiv, "loading"); | |
| R.addClass(a.html.overlayDiv, "playing"); | |
| a.html.containerDiv.appendChild(a.html.videoElement); | |
| a.html.videoImg.style.display = "none"; | |
| a.html.videoElement.play(); | |
| a.playing = !0 | |
| })) | |
| }; | |
| this.toggle = function() { | |
| this.playing ? this.stop() : this.play() | |
| } | |
| }; | |
| R.DeviceSlider = function() { | |
| var a = this; | |
| this.html = {}; | |
| this.dragHelper = null; | |
| this.animating = !1; | |
| var d = 0, | |
| f = 0, | |
| g = 0, | |
| c = !1; | |
| this.init = function(a) { | |
| this.html.containerDiv = a; | |
| this.html.deviceDivs = a.querySelectorAll(".device"); | |
| this.html.deviceGroupDiv = a.querySelector(".device-group"); | |
| this.html.deviceGroupContentDiv = a.querySelector(".device-group-content"); | |
| this.html.paginationBarDiv = a.querySelector(".pagination-bar"); | |
| this.html.paginationBarOuterDiv = a.querySelector(".pagination-bar-outer"); | |
| this.html.paginationBarInnerDiv = | |
| a.querySelector(".pagination-bar-inner"); | |
| this.html.paginationBarContentDiv = a.querySelector(".pagination-bar-content"); | |
| this.html.paginationBarHandleDiv = a.querySelector(".pagination-bar-handle"); | |
| var c = this.html.deviceDivs[0].offsetWidth; | |
| this.dragHelper = (new DragHelper).init(); | |
| this.dragHelper.getDimensionX = function() { | |
| return c | |
| }; | |
| return this | |
| }; | |
| this.activate = function() { | |
| (c = this.html.containerDiv.offsetWidth < this.html.deviceGroupContentDiv.offsetWidth) && this.enableSlideshow(); | |
| this.addListeners() | |
| }; | |
| this.deactivate = | |
| function() { | |
| this.removeListeners() | |
| }; | |
| this.enableSlideshow = function() { | |
| this.html.paginationBarDiv.style.display = "block"; | |
| this.calculateBounds(); | |
| R.addClass(this.html.containerDiv, "device-slideshow-enabled"); | |
| var a = R.normalize(0, -this.rightBoundP, this.leftBoundP, 1, 0); | |
| g = Math.round(a * (this.html.deviceDivs.length - 1)); | |
| this.updateElements() | |
| }; | |
| this.disableSlideshow = function() { | |
| R.removeClass(this.html.containerDiv, "device-slideshow-enabled"); | |
| R.setTransform(this.html.deviceGroupDiv, ""); | |
| this.html.paginationBarDiv.style.display = | |
| "none" | |
| }; | |
| this.onDrag = function(c, g, l, n, p, r) { | |
| c = f + c / a.html.deviceGroupDiv.offsetWidth; | |
| g = R.normalize(c, -a.rightBoundP, a.leftBoundP, 1 - a.handleWidthP, 0); | |
| R.setTransform(a.html.deviceGroupDiv, "translate3d(" + 100 * c + "%,0,0)"); | |
| R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * g + "%,0,0)"); | |
| d = c; | |
| return !1 | |
| }; | |
| this.onDragComplete = function(c, k) { | |
| if (c != DragHelper.OUTCOME_CLICK) { | |
| var l = R.normalize(d, -this.rightBoundP, this.leftBoundP, 1, 0), | |
| l = Math.ceil(l * (this.html.deviceDivs.length - 1)); | |
| switch (c) { | |
| case DragHelper.OUTCOME_BACK: | |
| l -= | |
| 1 | |
| } | |
| g = l = Math.max(Math.min(l, this.html.deviceDivs.length - 1), 0); | |
| var n = g / (this.html.deviceDivs.length - 1), | |
| l = R.normalize(n, 1, 0, -this.rightBoundP, this.leftBoundP), | |
| n = R.normalize(n, 1, 0, 1 - this.handleWidthP, 0); | |
| d != l && (R.setTransition(this.html.deviceGroupDiv, "transform .2s ease-out"), R.setTransform(this.html.deviceGroupDiv, "translate3d(" + 100 * l + "%,0,0)"), R.setTransition(this.html.paginationBarContentDiv, "transform .2s ease-out"), R.setTransform(this.html.paginationBarContentDiv, "translate3d(" + 100 * n + "%,0,0)"), this.animating = !0, R.onTransitionEnd(this.html.paginationBarContentDiv, function() { | |
| R.setTransition(a.html.deviceGroupDiv, ""); | |
| R.setTransition(a.html.paginationBarContentDiv, ""); | |
| a.animating = !1 | |
| })); | |
| f = l | |
| } | |
| }; | |
| this.addListeners = function() { | |
| this.html.containerDiv[R.touch ? "ontouchstart" : "onmousedown"] = function(d) { | |
| if (!c) return !0; | |
| d.stopPropagation(); | |
| a.dragHelper.start(d); | |
| a.dragHelper.onDrag = void 0; | |
| a.dragHelper.onComplete = void 0; | |
| a.dragHelper.onIntentClear = a.dragIntentClear | |
| }; | |
| GlobalEvents.addListener(GlobalEvent.WINDOW_RESIZE, this.onResize.bind(this)) | |
| }; | |
| this.removeListeners = function() { | |
| this.html.containerDiv[R.touch ? "ontouchstart" : "onmousedown"] = void 0; | |
| GlobalEvents.removeListener(GlobalEvent.WINDOW_RESIZE, this.onResize.bind(this)) | |
| }; | |
| this.dragIntentClear = function(c) { | |
| a.animating || (c == DragHelper.DRAG_DIRECTION_X ? (R.setTransition(a.html.deviceGroupDiv, ""), R.setTransition(a.html.paginationBarContentDiv, ""), a.dragHelper.onDrag = a.onDrag.bind(a), a.dragHelper.onComplete = a.onDragComplete.bind(a), a.dragHelper.onIntentClear = void 0) : (a.dragHelper.onDrag = void 0, | |
| a.dragHelper.onComplete = void 0, a.dragHelper.onIntentClear = void 0, a.dragHelper.stop())) | |
| }; | |
| this.onResize = function() { | |
| !c && this.html.containerDiv.offsetWidth < this.html.deviceGroupContentDiv.offsetWidth ? (this.enableSlideshow(), c = !0) : c && this.html.containerDiv.offsetWidth > this.html.deviceGroupContentDiv.offsetWidth ? (this.disableSlideshow(), c = !1) : c && (this.calculateBounds(), this.updateElements()) | |
| }; | |
| this.calculateBounds = function() { | |
| var a = (this.html.deviceGroupContentDiv.offsetWidth - this.html.containerDiv.offsetWidth) / | |
| 2, | |
| c = this.html.deviceDivs[0]; | |
| this.leftBound = a - c.offsetLeft + this.html.containerDiv.offsetWidth / 2 - c.offsetWidth / 2; | |
| this.leftBoundP = this.leftBound / this.html.deviceGroupDiv.offsetWidth; | |
| c = this.html.deviceDivs[this.html.deviceDivs.length - 1]; | |
| this.rightBound = a - (this.html.deviceGroupContentDiv.offsetWidth - (c.offsetLeft + c.offsetWidth)) + this.html.containerDiv.offsetWidth / 2 - c.offsetWidth / 2; | |
| this.rightBoundP = this.rightBound / this.html.deviceGroupDiv.offsetWidth; | |
| this.handleWidthP = this.html.paginationBarHandleDiv.offsetWidth / | |
| this.html.paginationBarContentDiv.offsetWidth | |
| }; | |
| this.updateElements = function() { | |
| var c = g / (this.html.deviceDivs.length - 1), | |
| d = R.normalize(c, 1, 0, -this.rightBoundP, this.leftBoundP), | |
| c = R.normalize(c, 1, 0, 1 - this.handleWidthP, 0); | |
| R.setTransition(a.html.deviceGroupDiv, ""); | |
| R.setTransform(a.html.deviceGroupDiv, "translate3d(" + 100 * d + "%,0,0)"); | |
| R.setTransition(a.html.paginationBarContentDiv, ""); | |
| R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * c + "%,0,0)"); | |
| f = d | |
| } | |
| }; | |
| R.SimpleSlider = function() { | |
| var a = this; | |
| this.html = {}; | |
| this.dragHelper = null; | |
| this.animating = !1; | |
| var d = 0, | |
| f = 0; | |
| this.init = function(a) { | |
| this.html.containerDiv = a; | |
| this.html.containerDiv.simpleSlider = this; | |
| this.html.stampImagesDiv = a.querySelector(".stamp-images"); | |
| this.html.stampImagesOverflowDiv = a.querySelector(".stamp-images-overflow"); | |
| this.html.paginationBarDiv = a.querySelector(".pagination-bar"); | |
| this.html.paginationBarOuterDiv = a.querySelector(".pagination-bar-outer"); | |
| this.html.paginationBarInnerDiv = a.querySelector(".pagination-bar-inner"); | |
| this.html.paginationBarContentDiv = a.querySelector(".pagination-bar-content"); | |
| this.html.paginationBarHandleDiv = a.querySelector(".pagination-bar-handle"); | |
| this.handleWidthP = this.html.paginationBarHandleDiv.offsetWidth / this.html.paginationBarContentDiv.offsetWidth; | |
| this.dragHelper = (new DragHelper).init(); | |
| this.dragHelper.getDimensionX = function() { | |
| return 600 | |
| }; | |
| a = this.html.stampImagesDiv.offsetWidth; | |
| var c = this.html.stampImagesOverflowDiv.offsetWidth; | |
| this.leftBoundP = 0; | |
| this.rightBoundP = (c - a) / c; | |
| return this | |
| }; | |
| this.activate = | |
| function() { | |
| this.addListeners() | |
| }; | |
| this.deactivate = function() { | |
| this.removeListeners() | |
| }; | |
| this.updateScrollIndicator = function() { | |
| var d = this.html.stampImagesOverflowDiv.offsetWidth, | |
| d = R.normalize(this.html.stampImagesDiv.scrollLeft / d, 0, (d - this.html.stampImagesDiv.offsetWidth) / d, 0, 1 - a.handleWidthP); | |
| R.setTransform(this.html.paginationBarContentDiv, "translate3d(" + 100 * d + "%,0,0)") | |
| }; | |
| this.addListeners = function() { | |
| R.touch && (this.html.stampImagesDiv.onscroll = function() { | |
| a.updateScrollIndicator() | |
| }); | |
| this.html.containerDiv[R.touch ? | |
| "ontouchstart" : "onmousedown"] = function(d) { | |
| d.stopPropagation(); | |
| R.touch || a.animating || (a.dragHelper.start(d), a.dragHelper.onDrag = a.onDrag, a.dragHelper.onComplete = a.onDragComplete) | |
| } | |
| }; | |
| this.removeListeners = function() { | |
| R.touch && (this.html.stampImagesDiv.onscroll = void 0); | |
| this.html.containerDiv[R.touch ? "ontouchstart" : "onmousedown"] = void 0 | |
| }; | |
| this.onDrag = function(g, c, h, k, l, n) { | |
| g = f + g / a.html.stampImagesOverflowDiv.offsetWidth; | |
| c = R.normalize(g, a.leftBoundP, a.rightBoundP, 0, 1 - a.handleWidthP); | |
| R.setTransform(a.html.stampImagesOverflowDiv, | |
| "translate3d(" + 100 * g + "%,0,0)"); | |
| R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * -c + "%,0,0)"); | |
| d = g; | |
| return !1 | |
| }; | |
| this.onDragComplete = function(g, c) { | |
| if (g != DragHelper.OUTCOME_CLICK) { | |
| var h = !1; | |
| d > a.leftBoundP ? (d = a.leftBoundP, h = !0) : d < -a.rightBoundP && (d = -a.rightBoundP, h = !0); | |
| h && (R.setTransition(a.html.stampImagesOverflowDiv, "transform .2s ease-out"), R.setTransform(a.html.stampImagesOverflowDiv, "translate3d(" + 100 * d + "%,0,0)"), h = R.normalize(d, a.leftBoundP, a.rightBoundP, 0, 1 - a.handleWidthP), R.setTransition(a.html.paginationBarContentDiv, | |
| "transform .2s ease-out"), R.setTransform(a.html.paginationBarContentDiv, "translate3d(" + 100 * -h + "%,0,0)"), a.animating = !0, R.onTransitionEnd(a.html.paginationBarContentDiv, function() { | |
| R.setTransition(a.html.stampImagesOverflowDiv, ""); | |
| R.setTransition(a.html.paginationBarContentDiv, ""); | |
| a.animating = !1 | |
| })); | |
| f = d | |
| } | |
| } | |
| }; | |
| R.Fonts = function() { | |
| GlobalEvent.FONTS_READY = "global_event_fonts_ready"; | |
| this.init = function() { | |
| window.WebFontConfig = { | |
| fontdeck: { | |
| id: "46186" | |
| }, | |
| typekit: { | |
| id: "djg5lpq" | |
| }, | |
| timeout: 5E3, | |
| loading: function() { | |
| GlobalEvents.dispatch(new GlobalEvent(GlobalEvent.FONTS_READY)) | |
| } | |
| }; | |
| (function() { | |
| var a = document.createElement("script"); | |
| a.src = ("https:" == document.location.protocol ? "https" : "http") + "://ajax.googleapis.com/ajax/libs/webfont/1.5.6/webfont.js"; | |
| a.type = "text/javascript"; | |
| a.async = "true"; | |
| var d = document.getElementsByTagName("script")[0]; | |
| d.parentNode.insertBefore(a, d) | |
| })(); | |
| return this | |
| } | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi - what JS library is this, and how does one use it? Thanks!