以下是 HTML5 Canvas头发飘逸动画代码 的示例演示效果:
部分效果截图:
HTML代码(index.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5 Canvas头发飘逸动画</title>
<link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
</head>
<body>
<canvas id="canvas"></canvas>
<script src="js/index.js"></script>
</body>
</html>
JS代码(index.js):
/* * Sorry for the compiled code. The original uses AMD and can be * found on Github:https://github.com/MathiasPaumgarten/hair */
var requirejs,require,define;
(function(global){
function isFunction(e){
return ostring.call(e)==="[object Function]"}
function isArray(e){
return ostring.call(e)==="[object Array]"}
function each(e,t){
if(e){
var n;
for(n=0;
n<e.length;
n+=1)if(e[n]&&t(e[n],n,e))break}
}
function eachReverse(e,t){
if(e){
var n;
for(n=e.length-1;
n>-1;
n-=1)if(e[n]&&t(e[n],n,e))break}
}
function hasProp(e,t){
return hasOwn.call(e,t)}
function eachProp(e,t){
var n;
for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n))break}
function mixin(e,t,n,r){
return t&&eachProp(t,function(t,i){
if(n||!hasProp(e,i))r&&typeof t!="string"?(e[i]||(e[i]={
}
),mixin(e[i],t,n,r)):e[i]=t}
),e}
function bind(e,t){
return function(){
return t.apply(e,arguments)}
}
function scripts(){
return document.getElementsByTagName("script")}
function getGlobal(e){
if(!e)return e;
var t=global;
return each(e.split("."),function(e){
t=t[e]}
),t}
function makeContextModuleFunc(e,t,n){
return function(){
var r=aps.call(arguments,0),i;
return n&&isFunction(i=r[r.length-1])&&(i.__requireJsBuild=!0),r.push(t),e.apply(null,r)}
}
function addRequireMethods(e,t,n){
each([["toUrl"],["undef"],["defined","requireDefined"],["specified","requireSpecified"]],function(r){
var i=r[1]||r[0];
e[r[0]]=t?makeContextModuleFunc(t[i],n):function(){
var e=contexts[defContextName];
return e[i].apply(e,arguments)}
}
)}
function makeError(e,t,n,r){
var i=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);
return i.requireType=e,i.requireModules=r,n&&(i.originalError=n),i}
function newContext(e){
function v(e){
var t,n;
for(t=0;
e[t];
t+=1){
n=e[t];
if(n===".")e.splice(t,1),t-=1;
else if(n===".."){
if(t===1&&(e[2]===".."||e[0]===".."))break;
t>0&&(e.splice(t-1,2),t-=2)}
}
}
function m(e,t,n){
var r,i,s,u,a,f,l,c,h,p,d,m=t&&t.split("/"),g=m,y=o.map,b=y&&y["*"];
e&&e.charAt(0)==="."&&(t?(o.pkgs[t]?g=m=[t]:g=m.slice(0,m.length-1),e=g.concat(e.split("/")),v(e),i=o.pkgs[r=e[0]],e=e.join("/"),i&&e===r+"/"+i.main&&(e=r)):e.indexOf("./")===0&&(e=e.substring(2)));
if(n&&(m||b)&&y){
u=e.split("/");
for(a=u.length;
a>0;
a-=1){
l=u.slice(0,a).join("/");
if(m)for(f=m.length;
f>0;
f-=1){
s=y[m.slice(0,f).join("/")];
if(s){
s=s[l];
if(s){
c=s,h=a;
break}
}
}
if(c)break;
!p&&b&&b[l]&&(p=b[l],d=a)}
!c&&p&&(c=p,h=d),c&&(u.splice(0,h,c),e=u.join("/"))}
return e}
function g(e){
isBrowser&&each(scripts(),function(t){
if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===r.contextName)return t.parentNode.removeChild(t),!0}
)}
function y(e){
var t=o.paths[e];
if(t&&isArray(t)&&t.length>1)return g(e),t.shift(),r.undef(e),r.require([e]),!0}
function b(e,t,n,i){
var s,o,u,a=e?e.indexOf("!"):-1,f=null,c=t?t.name:null,d=e,v=!0,g="";
return e||(v=!1,e="_@r"+(h+=1)),a!==-1&&(f=e.substring(0,a),e=e.substring(a+1,e.length)),f&&(f=m(f,c,i),o=l[f]),e&&(f?o&&o.normalize?g=o.normalize(e,function(e){
return m(e,c,i)}
):g=m(e,c,i):(g=m(e,c,i),s=r.nameToUrl(g))),u=f&&!o&&!n?"_unnormalized"+(p+=1):"",{
prefix:f,name:g,parentMap:t,unnormalized:!!u,url:s,originalName:d,isDefine:v,id:(f?f+"!"+g:g)+u}
}
function w(e){
var t=e.id,n=u[t];
return n||(n=u[t]=new r.Module(e)),n}
function E(e,t,n){
var r=e.id,i=u[r];
hasProp(l,r)&&(!i||i.defineEmitComplete)?t==="defined"&&n(l[r]):w(e).on(t,n)}
function S(e,t){
var n=e.requireModules,r=!1;
t?t(e):(each(n,function(t){
var n=u[t];
n&&(n.error=e,n.events.error&&(r=!0,n.emit("error",e)))}
),r||req.onError(e))}
function x(){
globalDefQueue.length&&(apsp.apply(f,[f.length-1,0].concat(globalDefQueue)),globalDefQueue=[])}
function T(e,t,n){
var i=e&&e.map,s=makeContextModuleFunc(n||r.require,i,t);
return addRequireMethods(s,r,i),s.isBrowser=isBrowser,s}
function N(e){
delete u[e],each(d,function(t,n){
if(t.map.id===e)return d.splice(n,1),t.defined||(r.waitCount-=1),!0}
)}
function C(e,t){
var n=e.map.id,r=e.depMaps,i;
if(!e.inited)return;
return t[n]?e:(t[n]=!0,each(r,function(e){
var r=e.id,s=u[r];
if(!s)return;
return!s.inited||!s.enabled?(i=null,delete t[n],!0):i=C(s,mixin({
}
,t))}
),i)}
function k(e,t,n){
var r=e.map.id,s=e.depMaps;
if(!e.inited||!e.map.isDefine)return;
return t[r]?l[r]:(t[r]=e,each(s,function(s){
var o=s.id,a=u[o],f;
if(i[o])return;
if(a){
if(!a.inited||!a.enabled){
n[r]=!0;
return}
f=k(a,t,n),n[o]||e.defineDepById(o,f)}
}
),e.check(!0),l[r])}
function L(e){
e.check()}
function A(){
var e,n,i,a,f=o.waitSeconds*1e3,l=f&&r.startTime+f<(new Date).getTime(),c=[],h=!1,p=!0;
if(t)return;
t=!0,eachProp(u,function(t){
e=t.map,n=e.id;
if(!t.enabled)return;
if(!t.error)if(!t.inited&&l)y(n)?(a=!0,h=!0):(c.push(n),g(n));
else if(!t.inited&&t.fetched&&e.isDefine){
h=!0;
if(!e.prefix)return p=!1}
}
);
if(l&&c.length)return i=makeError("timeout","Load timeout for modules:"+c,null,c),i.contextName=r.contextName,S(i);
p&&(each(d,function(e){
if(e.defined)return;
var t=C(e,{
}
),n={
}
;
t&&(k(t,n,{
}
),eachProp(n,L))}
),eachProp(u,L)),(!l||a)&&h&&(isBrowser||isWebWorker)&&!s&&(s=setTimeout(function(){
s=0,A()}
,50)),t=!1}
function O(e){
w(b(e[0],null,!0)).init(e[1],e[2])}
function M(e,t,n,r){
e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(n,t,!1)}
function _(e){
var t=e.currentTarget||e.srcElement;
return M(t,r.onScriptLoad,"load","onreadystatechange"),M(t,r.onScriptError,"error"),{
node:t,id:t&&t.getAttribute("data-requiremodule")}
}
var t,n,r,i,s,o={
waitSeconds:7,baseUrl:"./",paths:{
}
,pkgs:{
}
,shim:{
}
}
,u={
}
,a={
}
,f=[],l={
}
,c={
}
,h=1,p=1,d=[];
return i={
require:function(e){
return T(e)}
,exports:function(e){
e.usingExports=!0;
if(e.map.isDefine)return e.exports=l[e.map.id]={
}
}
,module:function(e){
return e.module={
id:e.map.id,uri:e.map.url,config:function(){
return o.config&&o.config[e.map.id]||{
}
}
,exports:l[e.map.id]}
}
}
,n=function(e){
this.events=a[e.id]||{
}
,this.map=e,this.shim=o.shim[e.id],this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={
}
,this.depCount=0}
,n.prototype={
init:function(e,t,n,r){
r=r||{
}
;
if(this.inited)return;
this.factory=t,n?this.on("error",n):this.events.error&&(n=bind(this,function(e){
this.emit("error",e)}
)),this.depMaps=e&&e.slice(0),this.depMaps.rjsSkipMap=e.rjsSkipMap,this.errback=n,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check()}
,defineDepById:function(e,t){
var n;
return each(this.depMaps,function(t,r){
if(t.id===e)return n=r,!0}
),this.defineDep(n,t)}
,defineDep:function(e,t){
this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)}
,fetch:function(){
if(this.fetched)return;
this.fetched=!0,r.startTime=(new Date).getTime();
var e=this.map;
if(!this.shim)return e.prefix?this.callPlugin():this.load();
T(this,!0)(this.shim.deps||[],bind(this,function(){
return e.prefix?this.callPlugin():this.load()}
))}
,load:function(){
var e=this.map.url;
c[e]||(c[e]=!0,r.load(this.map.id,e))}
,check:function(e){
if(!this.enabled||this.enabling)return;
var t,n,i=this.map.id,s=this.depExports,o=this.exports,a=this.factory;
if(!this.inited)this.fetch();
else if(this.error)this.emit("error",this.error);
else if(!this.defining){
this.defining=!0;
if(this.depCount<1&&!this.defined){
if(isFunction(a)){
if(this.events.error)try{
o=r.execCb(i,a,s,o)}
catch(f){
t=f}
else o=r.execCb(i,a,s,o);
this.map.isDefine&&(n=this.module,n&&n.exports!==undefined&&n.exports!==this.exports?o=n.exports:o===undefined&&this.usingExports&&(o=this.exports));
if(t)return t.requireMap=this.map,t.requireModules=[this.map.id],t.requireType="define",S(this.error=t)}
else o=a;
this.exports=o,this.map.isDefine&&!this.ignore&&(l[i]=o,req.onResourceLoad&&req.onResourceLoad(r,this.map,this.depMaps)),delete u[i],this.defined=!0,r.waitCount-=1,r.waitCount===0&&(d=[])}
this.defining=!1,e||this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}
}
,callPlugin:function(){
var e=this.map,t=e.id,n=b(e.prefix,null,!1,!0);
E(n,"defined",bind(this,function(n){
var i,s,a,f=this.map.name,l=this.map.parentMap?this.map.parentMap.name:null;
if(this.map.unnormalized){
n.normalize&&(f=n.normalize(f,function(e){
return m(e,l,!0)}
)||""),s=b(e.prefix+"!"+f,this.map.parentMap,!1,!0),E(s,"defined",bind(this,function(e){
this.init([],function(){
return e}
,null,{
enabled:!0,ignore:!0}
)}
)),a=u[s.id],a&&(this.events.error&&a.on("error",bind(this,function(e){
this.emit("error",e)}
)),a.enable());
return}
i=bind(this,function(e){
this.init([],function(){
return e}
,null,{
enabled:!0}
)}
),i.error=bind(this,function(e){
this.inited=!0,this.error=e,e.requireModules=[t],eachProp(u,function(e){
e.map.id.indexOf(t+"_unnormalized")===0&&N(e.map.id)}
),S(e)}
),i.fromText=function(e,t){
var n=useInteractive;
n&&(useInteractive=!1),w(b(e)),req.exec(t),n&&(useInteractive=!0),r.completeLoad(e)}
,n.load(e.name,T(e.parentMap,!0,function(e,t,n){
return e.rjsSkipMap=!0,r.require(e,t,n)}
),i,o)}
)),r.enable(n,this),this.pluginMaps[n.id]=n}
,enable:function(){
this.enabled=!0,this.waitPushed||(d.push(this),r.waitCount+=1,this.waitPushed=!0),this.enabling=!0,each(this.depMaps,bind(this,function(e,t){
var n,s,o;
if(typeof e=="string"){
e=b(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.depMaps.rjsSkipMap),this.depMaps[t]=e,o=i[e.id];
if(o){
this.depExports[t]=o(this);
return}
this.depCount+=1,E(e,"defined",bind(this,function(e){
this.defineDep(t,e),this.check()}
)),this.errback&&E(e,"error",this.errback)}
n=e.id,s=u[n],!i[n]&&s&&!s.enabled&&r.enable(e,this)}
)),eachProp(this.pluginMaps,bind(this,function(e){
var t=u[e.id];
t&&!t.enabled&&r.enable(e,this)}
)),this.enabling=!1,this.check()}
,on:function(e,t){
var n=this.events[e];
n||(n=this.events[e]=[]),n.push(t)}
,emit:function(e,t){
each(this.events[e],function(e){
e(t)}
),e==="error"&&delete this.events[e]}
}
,r={
config:o,contextName:e,registry:u,defined:l,urlFetched:c,waitCount:0,defQueue:f,Module:n,makeModuleMap:b,configure:function(e){
e.baseUrl&&e.baseUrl.charAt(e.baseUrl.length-1)!=="/"&&(e.baseUrl+="/");
var t=o.pkgs,n=o.shim,i=o.paths,s=o.map;
mixin(o,e,!0),o.paths=mixin(i,e.paths,!0),e.map&&(o.map=mixin(s||{
}
,e.map,!0,!0)),e.shim&&(eachProp(e.shim,function(e,t){
isArray(e)&&(e={
deps:e}
),e.exports&&!e.exports.__buildReady&&(e.exports=r.makeShimExports(e.exports)),n[t]=e}
),o.shim=n),e.packages&&(each(e.packages,function(e){
var n;
e=typeof e=="string"?{
name:e}
:e,n=e.location,t[e.name]={
name:e.name,location:n||e.name,main:(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}
}
),o.pkgs=t),eachProp(u,function(e,t){
!e.inited&&!e.map.unnormalized&&(e.map=b(t))}
),(e.deps||e.callback)&&r.require(e.deps||[],e.callback)}
,makeShimExports:function(e){
var t;
return typeof e=="string"?(t=function(){
return getGlobal(e)}
,t.exports=e,t):function(){
return e.apply(global,arguments)}
}
,requireDefined:function(e,t){
return hasProp(l,b(e,t,!1,!0).id)}
,requireSpecified:function(e,t){
return e=b(e,t,!1,!0).id,hasProp(l,e)||hasProp(u,e)}
,require:function(t,n,i,s){
var o,u,a,c,h;
if(typeof t=="string")return isFunction(n)?S(makeError("requireargs","Invalid require call"),i):req.get?req.get(r,t,n):(o=t,s=n,a=b(o,s,!1,!0),u=a.id,hasProp(l,u)?l[u]:S(makeError("notloaded",'Module name "'+u+'" has not been loaded yet for context:'+e)));
i&&!isFunction(i)&&(s=i,i=undefined),n&&!isFunction(n)&&(s=n,n=undefined),x();
while(f.length){
h=f.shift();
if(h[0]===null)return S(makeError("mismatch","Mismatched anonymous define() module:"+h[h.length-1]));
O(h)}
return c=w(b(null,s)),c.init(t,n,i,{
enabled:!0}
),A(),r.require}
,undef:function(e){
x();
var t=b(e,null,!0),n=u[e];
delete l[e],delete c[t.url],delete a[e],n&&(n.events.defined&&(a[e]=n.events),N(e))}
,enable:function(e,t){
var n=u[e.id];
n&&w(e).enable()}
,completeLoad:function(e){
var t,n,r,i=o.shim[e]||{
}
,s=i.exports&&i.exports.exports;
x();
while(f.length){
n=f.shift();
if(n[0]===null){
n[0]=e;
if(t)break;
t=!0}
else n[0]===e&&(t=!0);
O(n)}
r=u[e];
if(!t&&!l[e]&&r&&!r.inited){
if(o.enforceDefine&&(!s||!getGlobal(s))){
if(y(e))return;
return S(makeError("nodefine","No define call for "+e,null,[e]))}
O([e,i.deps||[],i.exports])}
A()}
,toUrl:function(e,t){
var n=e.lastIndexOf("."),i=null;
return n!==-1&&(i=e.substring(n,e.length),e=e.substring(0,n)),r.nameToUrl(m(e,t&&t.id,!0),i)}
,nameToUrl:function(e,t){
var n,r,i,s,u,a,f,l,c;
if(req.jsExtRegExp.test(e))l=e+(t||"");
else{
n=o.paths,r=o.pkgs,u=e.split("/");
for(a=u.length;
a>0;
a-=1){
f=u.slice(0,a).join("/"),i=r[f],c=n[f];
if(c){
isArray(c)&&(c=c[0]),u.splice(0,a,c);
break}
if(i){
e===i.name?s=i.location+"/"+i.main:s=i.location,u.splice(0,a,s);
break}
}
l=u.join("/"),l+=t||(/\?/.test(l)?"":".js"),l=(l.charAt(0)==="/"||l.match(/^[\w\+\.\-]+:/)?"":o.baseUrl)+l}
return o.urlArgs?l+((l.indexOf("?")===-1?"?":"&")+o.urlArgs):l}
,load:function(e,t){
req.load(r,e,t)}
,execCb:function(e,t,n,r){
return t.apply(r,n)}
,onScriptLoad:function(e){
if(e.type==="load"||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){
interactiveScript=null;
var t=_(e);
r.completeLoad(t.id)}
}
,onScriptError:function(e){
var t=_(e);
if(!y(t.id))return S(makeError("scripterror","Script error",e,[t.id]))}
}
}
function getInteractiveScript(){
return interactiveScript&&interactiveScript.readyState==="interactive"?interactiveScript:(eachReverse(scripts(),function(e){
if(e.readyState==="interactive")return interactiveScript=e}
),interactiveScript)}
var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.0.5",commentRegExp=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,ap=Array.prototype,aps=ap.slice,apsp=ap.splice,isBrowser=typeof window!="undefined"&&!!navigator&&!!document,isWebWorker=!isBrowser&&typeof importScripts!="undefined",readyRegExp=isBrowser&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera=typeof opera!="undefined"&&opera.toString()==="[object Opera]",contexts={
}
,cfg={
}
,globalDefQueue=[],useInteractive=!1;
if(typeof define!="undefined")return;
if(typeof requirejs!="undefined"){
if(isFunction(requirejs))return;
cfg=requirejs,requirejs=undefined}
typeof require!="undefined"&&!isFunction(require)&&(cfg=require,require=undefined),req=requirejs=function(e,t,n,r){
var i,s,o=defContextName;
return!isArray(e)&&typeof e!="string"&&(s=e,isArray(t)?(e=t,t=n,n=r):e=[]),s&&s.context&&(o=s.context),i=contexts[o],i||(i=contexts[o]=req.s.newContext(o)),s&&i.configure(s),i.require(e,t,n)}
,req.config=function(e){
return req(e)}
,require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={
contexts:contexts,newContext:newContext}
,req({
}
),addRequireMethods(req),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=function(e){
throw e}
,req.load=function(e,t,n){
var r=e&&e.config||{
}
,i;
if(isBrowser)return i=r.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),i.type=r.scriptType||"text/javascript",i.charset="utf-8",i.async=!0,i.setAttribute("data-requirecontext",e.contextName),i.setAttribute("data-requiremodule",t),i.attachEvent&&!(i.attachEvent.toString&&i.attachEvent.toString().indexOf("[native code")<0)&&!isOpera?(useInteractive=!0,i.attachEvent("onreadystatechange",e.onScriptLoad)):(i.addEventListener("load",e.onScriptLoad,!1),i.addEventListener("error",e.onScriptError,!1)),i.src=n,currentlyAddingScript=i,baseElement?head.insertBefore(i,baseElement):head.appendChild(i),currentlyAddingScript=null,i;
isWebWorker&&(importScripts(n),e.completeLoad(t))}
,isBrowser&&eachReverse(scripts(),function(e){
head||(head=e.parentNode),dataMain=e.getAttribute("data-main");
if(dataMain)return cfg.baseUrl||(src=dataMain.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath,dataMain=mainScript),dataMain=dataMain.replace(jsSuffixRegExp,""),cfg.deps=cfg.deps?cfg.deps.concat(dataMain):[dataMain],!0}
),define=function(e,t,n){
var r,i;
typeof e!="string"&&(n=t,t=e,e=null),isArray(t)||(n=t,t=[]),!t.length&&isFunction(n)&&n.length&&(n.toString().replace(commentRegExp,"").replace(cjsRequireRegExp,function(e,n){
t.push(n)}
),t=(n.length===1?["require"]:["require","exports","module"]).concat(t)),useInteractive&&(r=currentlyAddingScript||getInteractiveScript(),r&&(e||(e=r.getAttribute("data-requiremodule")),i=contexts[r.getAttribute("data-requirecontext")])),(i?i.defQueue:globalDefQueue).push([e,t,n])}
,define.amd={
jQuery:!0}
,req.exec=function(text){
return eval(text)}
,req(cfg)}
)(this),define("requireJS",function(){
}
),define("suds/oop/Class",[],function(){
var e=!1,t=/xyz/.test(function(){
xyz}
)?/\b_super\b/:/.*/
,n=function(){
}
;
return n.extend=function(n){
function o(){
!e&&this.initialize&&this.initialize.apply(this,arguments)}
var r=this.prototype;
e=!0;
var i=new this;
e=!1;
for(var s in n)i[s]=typeof n[s]=="function"&&typeof r[s]=="function"&&t.test(n[s])?function(e,t){
return function(){
var n=this._super;
this._super=r[e];
var i=t.apply(this,arguments);
return this._super=n,i}
}
(s,n[s]):n[s];
return o.prototype=i,o.prototype.constructor=o,o.extend=arguments.callee,o}
,n}
),define("suds/events/Dispatcher",["suds/oop/Class"],function(e){
"use strict";
var t=e.extend({
listeners:null,initialize:function(){
this.listeners=[]}
,addListener:function(e,t){
this.removeListener(e,t),this.listeners.push({
name:e,closure:t}
)}
,removeListener:function(e,t){
var n,r=0,i=this.listeners.length;
for(;
r<i;
r++)n=this.listeners[r],n.name===e&&n.closure===t&&(this.listeners.splice(r,1),r--,i--)}
,dispatch:function(e,t){
var n,r=0,i=this.listeners.length;
for(;
r<i;
r++){
n=this.listeners[r];
if(!n)continue;
n.name===e&&n.closure.call(null,t)}
}
,hasListenerFor:function(e){
var t,n=0,r=this.listeners.length;
for(;
n<r;
n++)if(this.listeners[n].name===e)return!0;
return!1}
,hasListeners:function(){
return this.listeners.length>0}
,removeAllListeners:function(){
this.listeners=[]}
}
);
return t}
),define("suds/patches/function.bind",[],function(){
return typeof Function.prototype.bind!="function"&&(Function.prototype.bind=function(e){
var t=this;
return function(){
t.apply(e,arguments)}
}
),!0}
),define("suds/events/Interval",["suds/events/Dispatcher","suds/patches/function.bind"],function(e){
var t="FRAME",n=function(){
return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){
window.setTimeout(e,1e3/60)}
}
(),r=e.extend({
FRAME:t,initialize:function(){
this._super(),this.loop()}
,loop:function(){
this.dispatch(t),n(this.loop.bind(this))}
}
),i=new r;
return i.FRAME=t,i}
),define("suds/helpers/MouseHelper",["suds/events/Dispatcher","suds/events/Interval"],function(e,t){
var n={
}
,r=new e,i=-1,s=-1;
n.x=-1,n.y=-1,n.startTracking=function(){
window.addEventListener("mousemove",o)}
,n.stopTracking=function(){
window.removeEventListener("mousemove",o),n.x=-1,n.y=-1}
,n.addListener=function(e,i){
e===n.MOUSE_MOVE&&(n.startTracking(),t.addListener(t.FRAME,u)),r.addListener(e,i)}
,n.removeListener=function(e,i){
r.removeListener(e,i);
var s=!1;
for(var o=0;
o<dispachter.listeners.length;
o++)dispachter.listeners[o].name===n.MOUSE_MOVE&&(s=!0);
s===!1&&(n.stopTracking(),t.removeListener(t.FRAME,u))}
;
var o=function(e){
n.x=e.clientX,n.y=e.clientY}
,u=function(e){
(n.x!==i||n.y!==s)&&r.dispatch(n.MOUSE_MOVE),i=n.x,s=n.y}
;
return n.MOUSE_MOVE="MouseHelper.MOUSE_MOVE",n}
),define("suds/math/Point",["suds/oop/Class"],function(e){
var t=e.extend({
x:0,y:0,initialize:function(e,t){
this.x=e||0,this.y=t||0}
,add:function(e){
return this.x+=e.x,this.y+=e.y,this}
,subtract:function(e){
return this.x-=e.x,this.y-=e.y,this}
,multiply:function(e){
return this.x*=e,this.y*=e,this}
,divide:function(e){
return this.x/=e,this.y/=e,this}
,clone:function(){
return new t(this.x,this.y)}
,length:function(){
return Math.sqrt(this.x*this.x+this.y*this.y)}
,normalize:function(){
return this.divide(this.length())}
,set:function(e){
return this.x=e.x,this.y=e.y,this}
,rotate:function(e){
var t=Math.cos(e),n=Math.sin(e),r=this.x*t-this.y*n,i=this.y*t+this.x*n;
return this.x=r,this.y=i,this}
,flip:function(){
return this.x*=-1,this.y*=-1,this}
}
);
return t.subtract=function(e,t){
return e.clone().subtract(t)}
,t.add=function(e,t){
return e.clone().add(t)}
,t.distance=function(e,t){
var n=e.x-t.x,r=e.y-t.y;
return Math.sqrt(n*n+r*r)}
,t.between=function(e,n){
return new t(n.x-e.x,n.y-e.y)}
,t}
),define("suds/math/Bezier",["suds/oop/Class","suds/math/Point"],function(e,t){
var n=e.extend({
anchors:null,time:0,speed:.1,pixels:null,x:null,y:null,pixelBased:!1,initialize:function(e,t,n){
this.anchors=[],this.pixelBased=typeof t=="undefined"?!1:!!t,this.accuracy=typeof n=="undefined"?10:n,this.time=0,this.speed=e||.1,this.pixels=this.speed}
,addAnchor:function(e){
this.anchors.push(e);
if(this.pixelBased){
var n=this.time,r=0,i=this.accuracy,s=0,o,u;
for(;
r<i;
r++){
this.time=r/i,this.calculate();
if(r===0){
o=new t(this.x,this.y);
continue}
u=o,u=new t(this.x,this.y),s+=t.distance(o,u)}
this.time=n,this.speed=Math.min(1,this.pixels/s)}
}
,update:function(){
this.time+=this.speed,this.time>1&&(this.time=1),this.calculate()}
,calculate:function(){
var e=this.time,t=this.anchors.length,n=[],r,i;
for(r=0;
r<t;
r++)n[r]={
x:this.anchors[r].x,y:this.anchors[r].y}
;
for(i=1;
i<t;
++i)for(r=0;
r<t-i;
++r)n[r].x=(1-e)*n[r].x+e*n[~~(r+1)].x,n[r].y=(1-e)*n[r].y+e*n[~~(r+1)].y;
this.x=n[0].x,this.y=n[0].y}
,isComplete:function(){
return this.time>=1}
,setPercent:function(e){
this.time=e,this.calculate()}
}
);
return n}
),define("suds/ui/Motion",["suds/oop/Class","suds/math/Point","suds/math/Bezier"],function(e,t,n){
var r=e.extend({
pointA:null,pointB:null,pointC:null,pointAB:null,pointBC:null,speed:.1,radius:10,initialize:function(e,t,r){
this.radius=e||this.radius,this.speed=t||this.speed,this.accuracy=r||10,this.bezier=new n(this.speed,!0,this.accuracy),this.pointA=this.getRandomPoint(),this.pointB=this.getRandomPoint(),this.pointC=this.getRandomPoint(),this.pointAB=this.getMiddle(this.pointA,this.pointB),this.pointBC=this.getMiddle(this.pointB,this.pointC),this.bezier.addAnchor(this.pointAB),this.bezier.addAnchor(this.pointB),this.bezier.addAnchor(this.pointBC)}
,update:function(){
if(this.bezier.isComplete()){
this.bezier=new n(this.speed,!0,this.accuracy),this.bezier.addAnchor(this.pointBC),this.bezier.addAnchor(this.pointC),this.pointA=this.pointB,this.pointB=this.pointC,this.pointC=this.getRandomPoint(),this.pointAB=this.pointBC,this.pointBC=this.getMiddle(this.pointB,this.pointC),this.bezier.addAnchor(this.pointBC),this.bezier.calculate();
return}
this.bezier.update()}
,getRandomPoint:function(){
var e=Math.random()*Math.PI*2;
return new t(Math.cos(e)*(.1+Math.random()*.9)*this.radius,Math.sin(e)*(.1+Math.random()*.9)*this.radius)}
,getMiddle:function(e,n){
return t.add(e,n).divide(2)}
,getX:function(){
return this.bezier.x}
,getY:function(){
return this.bezier.y}
,getPosition:function(){
return new t(this.bezier.x,this.bezier.y)}
}
);
return r}
),define("dat/utils/css",[],function(){
return{
load:function(e,t){
t=t||document;
var n=t.createElement("link");
n.type="text/css",n.rel="stylesheet",n.href=e,t.getElementsByTagName("head")[0].appendChild(n)}
,inject:function(e,t){
t=t||document;
var n=document.createElement("style");
n.type="text/css",n.innerHTML=e,t.getElementsByTagName("head")[0].appendChild(n)}
}
}
),function(){
var e=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],t=/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,n=/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,r=typeof location!="undefined"&&location.href,i=r&&location.protocol&&location.protocol.replace(/\:/,""),s=r&&location.hostname,o=r&&(location.port||undefined),u=[];
define("text",[],function(){
var a,f,l;
return typeof window!="undefined"&&window.navigator&&window.document?f=function(e,t){
var n=a.createXhr();
n.open("GET",e,!0),n.onreadystatechange=function(e){
n.readyState===4&&t(n.responseText)}
,n.send(null)}
:typeof process!="undefined"&&process.versions&&!!process.versions.node?(l=require.nodeRequire("fs"),f=function(e,t){
t(l.readFileSync(e,"utf8"))}
):typeof Packages!="undefined"&&(f=function(e,t){
var n="utf-8",r=new java.io.File(e),i=java.lang.System.getProperty("line.separator"),s=new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(r),n)),o,u,a="";
try{
o=new java.lang.StringBuffer,u=s.readLine(),u&&u.length()&&u.charAt(0)===65279&&(u=u.substring(1)),o.append(u);
while((u=s.readLine())!==null)o.append(i),o.append(u);
a=String(o.toString())}
finally{
s.close()}
t(a)}
),a={
version:"1.0.0",strip:function(e){
if(e){
e=e.replace(t,"");
var r=e.match(n);
r&&(e=r[1])}
else e="";
return e}
,jsEscape:function(e){
return e.replace(/(['\\])/g,"\\$1").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r")}
,createXhr:function(){
var t,n,r;
if(typeof XMLHttpRequest!="undefined")return new XMLHttpRequest;
for(n=0;
n<3;
n++){
r=e[n];
try{
t=new ActiveXObject(r)}
catch(i){
}
if(t){
e=[r];
break}
}
if(!t)throw new Error("createXhr():XMLHttpRequest not available");
return t}
,get:f,parseName:function(e){
var t=!1,n=e.indexOf("."),r=e.substring(0,n),i=e.substring(n+1,e.length);
return n=i.indexOf("!"),n!==-1&&(t=i.substring(n+1,i.length),t=t==="strip",i=i.substring(0,n)),{
moduleName:r,ext:i,strip:t}
}
,xdRegExp:/^((\w+)\:)?\/\/([^\/\\]+)/,useXhr:function(e,t,n,r){
var i=a.xdRegExp.exec(e),s,o,u;
return i?(s=i[2],o=i[3],o=o.split(":"),u=o[1],o=o[0],(!s||s===t)&&(!o||o===n)&&(!u&&!o||u===r)):!0}
,finishLoad:function(e,t,n,r,i){
n=t?a.strip(n):n,i.isBuild&&i.inlineText&&(u[e]=n),r(n)}
,load:function(e,t,n,u){
var f=a.parseName(e),l=f.moduleName+"."+f.ext,c=t.toUrl(l),h=u&&u.text&&u.text.useXhr||a.useXhr;
!r||h(c,i,s,o)?a.get(c,function(t){
a.finishLoad(e,f.strip,t,n,u)}
):t([l],function(e){
a.finishLoad(f.moduleName+"."+f.ext,f.strip,e,n,u)}
)}
,write:function(e,t,n,r){
if(t in u){
var i=a.jsEscape(u[t]);
n.asModule(e+"!"+t,"define(function (){
return '"+i+"';
}
);
\n")}
}
,writeFile:function(e,t,n,r,i){
var s=a.parseName(t),o=s.moduleName+"."+s.ext,u=n.toUrl(s.moduleName+"."+s.ext)+".js";
a.load(o,n,function(t){
var n=function(e){
return r(u,e)}
;
n.asModule=function(e,t){
return r.asModule(e,u,t)}
,a.write(e,o,n,i)}
,i)}
}
,a}
)}
(),define("text!dat/gui/saveDialogue.html",[],function(){
return'<div id="dg-save" class="dg dialogue">\r\n\r\n Here\'s the new load parameter for your <code>GUI</code>\'s constructor:\r\n\r\n <textarea id="dg-new-constructor"></textarea>\r\n\r\n <div id="dg-save-locally">\r\n\r\n <input id="dg-local-storage" type="checkbox"/> Automatically save\r\n values to <code>localStorage</code> on exit.\r\n\r\n <div id="dg-local-explain">The values saved to <code>localStorage</code> will\r\n override those passed to <code>dat.GUI</code>\'s constructor. This makes it\r\n easier to work incrementally,but <code>localStorage</code> is fragile,\r\n and your friends may not see the same values you do.\r\n \r\n </div>\r\n \r\n </div>\r\n\r\n</div>'}
),define("text!dat/gui/style.css",[],function(){
return"/**\r\n * dat-gui JavaScript Controller Library\r\n * http://code.google.com/p/dat-gui\r\n *\r\n * Copyright 2011 Data Arts Team,Google Creative Lab\r\n *\r\n * Licensed under the Apache License,Version 2.0 (the \"License\");
\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n */
\r\n\r\n.dg ul{
list-style:none;
margin:0;
padding:0;
width:100%;
clear:both}
.dg.ac{
position:fixed;
top:0;
left:0;
right:0;
height:0;
z-index:0}
.dg:not(.ac) .main{
overflow:hidden}
.dg.main{
-webkit-transition:opacity 0.1s linear;
-o-transition:opacity 0.1s linear;
-moz-transition:opacity 0.1s linear;
transition:opacity 0.1s linear}
.dg.main.taller-than-window{
overflow-y:auto}
.dg.main.taller-than-window .close-button{
opacity:1;
margin-top:-1px;
border-top:1px solid #2c2c2c}
.dg.main ul.closed .close-button{
opacity:1 !important}
.dg.main:hover .close-button,.dg.main .close-button.drag{
opacity:1}
.dg.main .close-button{
-webkit-transition:opacity 0.1s linear;
-o-transition:opacity 0.1s linear;
-moz-transition:opacity 0.1s linear;
transition:opacity 0.1s linear;
border:0;
position:absolute;
line-height:19px;
height:20px;
cursor:pointer;
text-align:center;
background-color:#000}
.dg.main .close-button:hover{
background-color:#111}
.dg.a{
float:right;
margin-right:15px;
overflow-x:hidden}
.dg.a.has-save ul{
margin-top:27px}
.dg.a.has-save ul.closed{
margin-top:0}
.dg.a .save-row{
position:fixed;
top:0;
z-index:1002}
.dg li{
-webkit-transition:height 0.1s ease-out;
-o-transition:height 0.1s ease-out;
-moz-transition:height 0.1s ease-out;
transition:height 0.1s ease-out}
.dg li:not(.folder){
cursor:auto;
height:27px;
line-height:27px;
overflow:hidden;
padding:0 4px 0 5px}
.dg li.folder{
padding:0;
border-left:4px solid rgba(0,0,0,0)}
.dg li.title{
cursor:pointer;
margin-left:-4px}
.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{
height:0;
overflow:hidden;
border:0}
.dg .cr{
clear:both;
padding-left:3px;
height:27px}
.dg .property-name{
cursor:default;
float:left;
clear:left;
width:40%;
overflow:hidden;
text-overflow:ellipsis}
.dg .c{
float:left;
width:60%}
.dg .c input[type=text]{
border:0;
margin-top:4px;
padding:3px;
width:100%;
float:right}
.dg .has-slider input[type=text]{
width:30%;
margin-left:0}
.dg .slider{
float:left;
width:66%;
margin-left:-5px;
margin-right:0;
height:19px;
margin-top:4px}
.dg .slider-fg{
height:100%}
.dg .c input[type=checkbox]{
margin-top:9px}
.dg .c select{
margin-top:5px}
.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{
cursor:pointer}
.dg .selector{
display:none;
position:absolute;
margin-left:-9px;
margin-top:23px;
z-index:10}
.dg .c:hover .selector,.dg .selector.drag{
display:block}
.dg li.save-row{
padding:0}
.dg li.save-row .button{
display:inline-block;
padding:0px 6px}
.dg.dialogue{
background-color:#222;
width:460px;
padding:15px;
font-size:13px;
line-height:15px}
#dg-new-constructor{
padding:10px;
color:#222;
font-family:Monaco,monospace;
font-size:10px;
border:0;
resize:none;
box-shadow:inset 1px 1px 1px #888;
word-wrap:break-word;
margin:12px 0;
display:block;
width:440px;
overflow-y:scroll;
height:100px;
position:relative}
#dg-local-explain{
display:none;
font-size:11px;
line-height:17px;
border-radius:3px;
background-color:#333;
padding:8px;
margin-top:10px}
#dg-local-explain code{
font-size:10px}
#dat-gui-save-locally{
display:none}
.dg{
color:#eee;
font:11px 'Lucida Grande',sans-serif;
text-shadow:0 -1px 0 #111}
.dg.main::-webkit-scrollbar{
width:5px;
background:#1a1a1a}
.dg.main::-webkit-scrollbar-corner{
height:0;
display:none}
.dg.main::-webkit-scrollbar-thumb{
border-radius:5px;
background:#676767}
.dg li:not(.folder){
background:#1a1a1a;
border-bottom:1px solid #2c2c2c}
.dg li.save-row{
line-height:25px;
background:#dad5cb;
border:0}
.dg li.save-row select{
margin-left:5px;
width:108px}
.dg li.save-row .button{
margin-left:5px;
margin-top:1px;
border-radius:2px;
font-size:9px;
line-height:7px;
padding:4px 4px 5px 4px;
background:#c5bdad;
color:#fff;
text-shadow:0 1px 0 #b0a58f;
box-shadow:0 -1px 0 #b0a58f;
cursor:pointer}
.dg li.save-row .button.gears{
background:#c5bdad url(data:image/png;
base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;
height:7px;
width:8px}
.dg li.save-row .button:hover{
background-color:#bab19e;
box-shadow:0 -1px 0 #b0a58f}
.dg li.folder{
border-bottom:0}
.dg li.title{
padding-left:16px;
background:#000 url(data:image/gif;
base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;
cursor:pointer;
border-bottom:1px solid rgba(255,255,255,0.2)}
.dg .closed li.title{
background-image:url(data:image/gif;
base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}
.dg .cr.boolean{
border-left:3px solid #806787}
.dg .cr.function{
border-left:3px solid #e61d5f}
.dg .cr.number{
border-left:3px solid #2fa1d6}
.dg .cr.number input[type=text]{
color:#2fa1d6}
.dg .cr.string{
border-left:3px solid #1ed36f}
.dg .cr.string input[type=text]{
color:#1ed36f}
.dg .cr.function:hover,.dg .cr.boolean:hover{
background:#111}
.dg .c input[type=text]{
background:#303030;
outline:none}
.dg .c input[type=text]:hover{
background:#3c3c3c}
.dg .c input[type=text]:focus{
background:#494949;
color:#fff}
.dg .c .slider{
background:#303030;
cursor:ew-resize}
.dg .c .slider-fg{
background:#2fa1d6}
.dg .c .slider:hover{
background:#3c3c3c}
.dg .c .slider:hover .slider-fg{
background:#44abda}
\r\n"}
),define("dat/utils/common",[],function(){
var e=Array.prototype.forEach,t=Array.prototype.slice;
return{
BREAK:{
}
,extend:function(e){
return this.each(t.call(arguments,1),function(t){
for(var n in t)this.isUndefined(t[n])||(e[n]=t[n])}
,this),e}
,defaults:function(e){
return this.each(t.call(arguments,1),function(t){
for(var n in t)this.isUndefined(e[n])&&(e[n]=t[n])}
,this),e}
,compose:function(){
var e=t.call(arguments);
return function(){
var n=t.call(arguments);
for(var r=e.length-1;
r>=0;
r--)n=[e[r].apply(this,n)];
return n[0]}
}
,each:function(t,n,r){
if(e&&t.forEach===e)t.forEach(n,r);
else if(t.length===t.length+0){
for(var i=0,s=t.length;
i<s;
i++)if(i in t&&n.call(r,t[i],i)===this.BREAK)return}
else for(var i in t)if(n.call(r,t[i],i)===this.BREAK)return}
,defer:function(e){
setTimeout(e,0)}
,toArray:function(e){
return e.toArray?e.toArray():t.call(e)}
,isUndefined:function(e){
return e===undefined}
,isNull:function(e){
return e===null}
,isNaN:function(e){
return e!==e}
,isArray:Array.isArray||function(e){
return e.constructor===Array}
,isObject:function(e){
return e===Object(e)}
,isNumber:function(e){
return e===e+0}
,isString:function(e){
return e===e+""}
,isBoolean:function(e){
return e===!1||e===!0}
,isFunction:function(e){
return Object.prototype.toString.call(e)==="[object Function]"}
}
}
),define("dat/controllers/Controller",["dat/utils/common"],function(e){
var t=function(e,t){
this.initialValue=e[t],this.domElement=document.createElement("div"),this.object=e,this.property=t,this.__onChange=undefined,this.__onFinishChange=undefined}
;
return e.extend(t.prototype,{
onChange:function(e){
return this.__onChange=e,this}
,onFinishChange:function(e){
return this.__onFinishChange=e,this}
,setValue:function(e){
return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this}
,getValue:function(){
return this.object[this.property]}
,updateDisplay:function(){
return this}
,isModified:function(){
return this.initialValue!==this.getValue()}
}
),t}
),define("dat/dom/dom",["dat/utils/common"],function(e){
function i(t){
if(t==="0"||e.isUndefined(t))return 0;
var n=t.match(r);
return e.isNull(n)?0:parseFloat(n[1])}
var t={
HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]}
,n={
}
;
e.each(t,function(t,r){
e.each(t,function(e){
n[e]=r}
)}
);
var r=/(\d+(\.\d+)?)px/,s={
makeSelectable:function(e,t){
if(e===undefined||e.style===undefined)return;
e.onselectstart=t?function(){
return!1}
:function(){
}
,e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off"}
,makeFullscreen:function(t,n,r){
e.isUndefined(n)&&(n=!0),e.isUndefined(r)&&(r=!0),t.style.position="absolute",n&&(t.style.left=0,t.style.right=0),r&&(t.style.top=0,t.style.bottom=0)}
,fakeEvent:function(t,r,i,s){
i=i||{
}
;
var o=n[r];
if(!o)throw new Error("Event type "+r+" not supported.");
var u=document.createEvent(o);
switch(o){
case"MouseEvents":var a=i.x||i.clientX||0,f=i.y||i.clientY||0;
u.initMouseEvent(r,i.bubbles||!1,i.cancelable||!0,window,i.clickCount||1,0,0,a,f,!1,!1,!1,!1,0,null);
break;
case"KeyboardEvents":var l=u.initKeyboardEvent||u.initKeyEvent;
e.defaults(i,{
cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:undefined,charCode:undefined}
),l(r,i.bubbles||!1,i.cancelable,window,i.ctrlKey,i.altKey,i.shiftKey,i.metaKey,i.keyCode,i.charCode);
break;
default:u.initEvent(r,i.bubbles||!1,i.cancelable||!0)}
e.defaults(u,s),t.dispatchEvent(u)}
,bind:function(e,t,n,r){
return r=r||!1,e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on"+t,n),s}
,unbind:function(e,t,n,r){
return r=r||!1,e.removeEventListener?e.removeEventListener(t,n,r):e.detachEvent&&e.detachEvent("on"+t,n),s}
,addClass:function(e,t){
if(e.className===undefined)e.className=t;
else if(e.className!==t){
var n=e.className.split(/ +/);
n.indexOf(t)==-1&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}
return s}
,removeClass:function(e,t){
if(t){
if(e.className!==undefined)if(e.className===t)e.removeAttribute("class");
else{
var n=e.className.split(/ +/),r=n.indexOf(t);
r!=-1&&(n.splice(r,1),e.className=n.join(" "))}
}
else e.className=undefined;
return s}
,hasClass:function(e,t){
return(new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)")).test(e.className)||!1}
,getWidth:function(e){
var t=getComputedStyle(e);
return i(t["border-left-width"])+i(t["border-right-width"])+i(t["padding-left"])+i(t["padding-right"])+i(t.width)}
,getHeight:function(e){
var t=getComputedStyle(e);
return i(t["border-top-width"])+i(t["border-bottom-width"])+i(t["padding-top"])+i(t["padding-bottom"])+i(t.height)}
,getOffset:function(e){
var t={
left:0,top:0}
;
if(e.offsetParent)do t.left+=e.offsetLeft,t.top+=e.offsetTop;
while(e=e.offsetParent);
return t}
,isActive:function(e){
return e===document.activeElement&&(e.type||e.href)}
}
;
return s}
),define("dat/controllers/OptionController",["dat/controllers/Controller","dat/dom/dom","dat/utils/common"],function(e,t,n){
var r=function(e,i,s){
r.superclass.call(this,e,i);
var o=this;
this.__select=document.createElement("select");
if(n.isArray(s)){
var u={
}
;
n.each(s,function(e){
u[e]=e}
),s=u}
n.each(s,function(e,t){
var n=document.createElement("option");
n.innerHTML=t,n.setAttribute("value",e),o.__select.appendChild(n)}
),this.updateDisplay(),t.bind(this.__select,"change",function(){
var e=this.options[this.selectedIndex].value;
o.setValue(e)}
),this.domElement.appendChild(this.__select)}
;
return r.superclass=e,n.extend(r.prototype,e.prototype,{
setValue:function(e){
var t=r.superclass.prototype.setValue.call(this,e);
return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),t}
,updateDisplay:function(){
return this.__select.value=this.getValue(),r.superclass.prototype.updateDisplay.call(this)}
}
),r}
),define("dat/controllers/NumberController",["dat/controllers/Controller","dat/utils/common"],function(e,t){
function r(e){
return e=e.toString(),e.indexOf(".")>-1?e.length-e.indexOf(".")-1:0}
var n=function(e,i,s){
n.superclass.call(this,e,i),s=s||{
}
,this.__min=s.min,this.__max=s.max,this.__step=s.step,t.isUndefined(this.__step)?this.initialValue==0?this.__impliedStep=1:this.__impliedStep=Math.pow(10,Math.floor(Math.log(this.initialValue)/Math.LN10))/10:this.__impliedStep=this.__step,this.__precision=r(this.__impliedStep)}
;
return n.superclass=e,t.extend(n.prototype,e.prototype,{
setValue:function(e){
return this.__min!==undefined&&e<this.__min?e=this.__min:this.__max!==undefined&&e>this.__max&&(e=this.__max),this.__step!==undefined&&e%this.__step!=0&&(e=Math.round(e/this.__step)*this.__step),n.superclass.prototype.setValue.call(this,e)}
,min:function(e){
return this.__min=e,this}
,max:function(e){
return this.__max=e,this}
,step:function(e){
return this.__step=e,this}
}
),n}
),define("dat/controllers/NumberControllerBox",["dat/controllers/NumberController","dat/dom/dom","dat/utils/common"],function(e,t,n){
function i(e,t){
var n=Math.pow(10,t);
return Math.round(e*n)/n}
var r=function(e,i,s){
function a(){
var e=parseFloat(o.__input.value);
n.isNaN(e)||o.setValue(e)}
function f(){
a(),o.__onFinishChange&&o.__onFinishChange.call(o,o.getValue())}
function l(e){
t.bind(window,"mousemove",c),t.bind(window,"mouseup",h),u=e.clientY}
function c(e){
var t=u-e.clientY;
o.setValue(o.getValue()+t*o.__impliedStep),u=e.clientY}
function h(){
t.unbind(window,"mousemove",c),t.unbind(window,"mouseup",h)}
this.__truncationSuspended=!1,r.superclass.call(this,e,i,s);
var o=this,u;
this.__input=document.createElement("input"),this.__input.setAttribute("type","text"),t.bind(this.__input,"change",a),t.bind(this.__input,"blur",f),t.bind(this.__input,"mousedown",l),t.bind(this.__input,"keydown",function(e){
e.keyCode===13&&(o.__truncationSuspended=!0,this.blur(),o.__truncationSuspended=!1)}
),this.updateDisplay(),this.domElement.appendChild(this.__input)}
;
return r.superclass=e,n.extend(r.prototype,e.prototype,{
updateDisplay:function(){
return this.__input.value=this.__truncationSuspended?this.getValue():i(this.getValue(),this.__precision),r.superclass.prototype.updateDisplay.call(this)}
}
),r}
),define("text!dat/controllers/NumberControllerSlider.css",[],function(){
return"/**\r\n * dat-gui JavaScript Controller Library\r\n * http://code.google.com/p/dat-gui\r\n *\r\n * Copyright 2011 Data Arts Team,Google Creative Lab\r\n *\r\n * Licensed under the Apache License,Version 2.0 (the \"License\");
\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n */
\r\n\r\n.slider{
\r\n box-shadow:inset 0 2px 4px rgba(0,0,0,0.15);
\r\n height:1em;
\r\n border-radius:1em;
\r\n background-color:#eee;
\r\n padding:0 0.5em;
\r\n overflow:hidden;
\r\n}
\r\n\r\n.slider-fg{
\r\n padding:1px 0 2px 0;
\r\n background-color:#aaa;
\r\n height:1em;
\r\n margin-left:-0.5em;
\r\n padding-right:0.5em;
\r\n border-radius:1em 0 0 1em;
\r\n}
\r\n\r\n.slider-fg:after{
\r\n display:inline-block;
\r\n border-radius:1em;
\r\n background-color:#fff;
\r\n border:1px solid #aaa;
\r\n content:'';
\r\n float:right;
\r\n margin-right:-1em;
\r\n margin-top:-1px;
\r\n height:0.9em;
\r\n width:0.9em;
\r\n}
"}
),define("dat/controllers/NumberControllerSlider",["dat/controllers/NumberController","dat/dom/dom","dat/utils/css","dat/utils/common","text!dat/controllers/NumberControllerSlider.css"],function(e,t,n,r,i){
function o(e,t,n,r,i){
return r+(i-r)*((e-t)/(n-t))}
var s=function(e,n,r,i,u){
function f(e){
t.bind(window,"mousemove",l),t.bind(window,"mouseup",c),l(e)}
function l(e){
e.preventDefault();
var n=t.getOffset(a.__background),r=t.getWidth(a.__background);
return a.setValue(o(e.clientX,n.left,n.left+r,a.__min,a.__max)),!1}
function c(){
t.unbind(window,"mousemove",l),t.unbind(window,"mouseup",c),a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())}
s.superclass.call(this,e,n,{
min:r,max:i,step:u}
);
var a=this;
this.__background=document.createElement("div"),this.__foreground=document.createElement("div"),t.bind(this.__background,"mousedown",f),t.addClass(this.__background,"slider"),t.addClass(this.__foreground,"slider-fg"),this.updateDisplay(),this.__background.appendChild(this.__foreground),this.domElement.appendChild(this.__background)}
;
return s.superclass=e,s.useDefaultStyles=function(){
n.inject(i)}
,r.extend(s.prototype,e.prototype,{
updateDisplay:function(){
var e=(this.getValue()-this.__min)/(this.__max-this.__min);
return this.__foreground.style.width=e*100+"%",s.superclass.prototype.updateDisplay.call(this)}
}
),s}
),define("dat/controllers/StringController",["dat/controllers/Controller","dat/dom/dom","dat/utils/common"],function(e,t,n){
var r=function(e,n){
function s(){
i.setValue(i.__input.value)}
function o(){
i.__onFinishChange&&i.__onFinishChange.call(i,i.getValue())}
r.superclass.call(this,e,n);
var i=this;
this.__input=document.createElement("input"),this.__input.setAttribute("type","text"),t.bind(this.__input,"keyup",s),t.bind(this.__input,"change",s),t.bind(this.__input,"blur",o),t.bind(this.__input,"keydown",function(e){
e.keyCode===13&&this.blur()}
),this.updateDisplay(),this.domElement.appendChild(this.__input)}
;
return r.superclass=e,n.extend(r.prototype,e.prototype,{
updateDisplay:function(){
return t.isActive(this.__input)||(this.__input.value=this.getValue()),r.superclass.prototype.updateDisplay.call(this)}
}
),r}
),define("dat/controllers/FunctionController",["dat/controllers/Controller","dat/dom/dom","dat/utils/common"],function(e,t,n){
var r=function(e,n,i){
r.superclass.call(this,e,n);
var s=this;
this.__button=document.createElement("div"),this.__button.innerHTML=i===undefined?"Fire":i,t.bind(this.__button,"click",function(e){
return e.preventDefault(),s.fire(),!1}
),t.addClass(this.__button,"button"),this.domElement.appendChild(this.__button)}
;
return r.superclass=e,n.extend(r.prototype,e.prototype,{
fire:function(){
this.__onChange&&this.__onChange.call(this),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.getValue().call(this.object)}
}
),r}
),define("dat/controllers/BooleanController",["dat/controllers/Controller","dat/dom/dom","dat/utils/common"],function(e,t,n){
var r=function(e,n){
function s(){
i.setValue(!i.__prev)}
r.superclass.call(this,e,n);
var i=this;
this.__prev=this.getValue(),this.__checkbox=document.createElement("input"),this.__checkbox.setAttribute("type","checkbox"),t.bind(this.__checkbox,"change",s,!1),this.domElement.appendChild(this.__checkbox),this.updateDisplay()}
;
return r.superclass=e,n.extend(r.prototype,e.prototype,{
setValue:function(e){
var t=r.superclass.prototype.setValue.call(this,e);
return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),t}
,updateDisplay:function(){
return this.getValue()===!0?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0):this.__checkbox.checked=!1,r.superclass.prototype.updateDisplay.call(this)}
}
),r}
),define("dat/controllers/factory",["dat/controllers/OptionController","dat/controllers/NumberControllerBox","dat/controllers/NumberControllerSlider","dat/controllers/StringController","dat/controllers/FunctionController","dat/controllers/BooleanController","dat/utils/common"],function(e,t,n,r,i,s,o){
return function(u,a){
var f=u[a];
if(o.isArray(arguments[2])||o.isObject(arguments[2]))return new e(u,a,arguments[2]);
if(o.isNumber(f))return o.isNumber(arguments[2])&&o.isNumber(arguments[3])?new n(u,a,arguments[2],arguments[3]):new t(u,a,{
min:arguments[2],max:arguments[3]}
);
if(o.isString(f))return new r(u,a);
if(o.isFunction(f))return new i(u,a,"");
if(o.isBoolean(f))return new s(u,a)}
}
),define("dat/color/toString",["dat/utils/common"],function(e){
return function(t){
if(t.a==1||e.isUndefined(t.a)){
var n=t.hex.toString(16);
while(n.length<6)n="0"+n;
return"#"+n}
return"rgba("+Math.round(t.r)+","+Math.round(t.g)+","+Math.round(t.b)+","+t.a+")"}
}
),define("dat/color/interpret",["dat/color/toString","dat/utils/common"],function(e,t){
var n,r,i=function(){
r=!1;
var e=arguments.length>1?t.toArray(arguments):arguments[0];
return t.each(s,function(i){
if(i.litmus(e))return t.each(i.conversions,function(i,s){
n=i.read(e);
if(r===!1&&n!==!1)return r=n,n.conversionName=s,n.conversion=i,t.BREAK}
),t.BREAK}
),r}
,s=[{
litmus:t.isString,conversions:{
THREE_CHAR_HEX:{
read:function(e){
var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);
return t===null?!1:{
space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString())}
}
,write:e}
,SIX_CHAR_HEX:{
read:function(e){
var t=e.match(/^#([A-F0-9]{
6}
)$/i);
return t===null?!1:{
space:"HEX",hex:parseInt("0x"+t[1].toString())}
}
,write:e}
,CSS_RGB:{
read:function(e){
var t=e.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/);
return t===null?!1:{
space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}
}
,write:e}
,CSS_RGBA:{
read:function(e){
var t=e.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/);
return t===null?!1:{
space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}
}
,write:e}
}
}
,{
litmus:t.isNumber,conversions:{
HEX:{
read:function(e){
return{
space:"HEX",hex:e,conversionName:"HEX"}
}
,write:function(e){
return e.hex}
}
}
}
,{
litmus:t.isArray,conversions:{
RGB_ARRAY:{
read:function(e){
return e.length!=3?!1:{
space:"RGB",r:e[0],g:e[1],b:e[2]}
}
,write:function(e){
return[e.r,e.g,e.b]}
}
,RGBA_ARRAY:{
read:function(e){
return e.length!=4?!1:{
space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}
}
,write:function(e){
return[e.r,e.g,e.b,e.a]}
}
}
}
,{
litmus:t.isObject,conversions:{
RGBA_OBJ:{
read:function(e){
return t.isNumber(e.r)&&t.isNumber(e.g)&&t.isNumber(e.b)&&t.isNumber(e.a)?{
space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}
:!1}
,write:function(e){
return{
r:e.r,g:e.g,b:e.b,a:e.a}
}
}
,RGB_OBJ:{
read:function(e){
return t.isNumber(e.r)&&t.isNumber(e.g)&&t.isNumber(e.b)?{
space:"RGB",r:e.r,g:e.g,b:e.b}
:!1}
,write:function(e){
return{
r:e.r,g:e.g,b:e.b}
}
}
,HSVA_OBJ:{
read:function(e){
return t.isNumber(e.h)&&t.isNumber(e.s)&&t.isNumber(e.v)&&t.isNumber(e.a)?{
space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}
:!1}
,write:function(e){
return{
h:e.h,s:e.s,v:e.v,a:e.a}
}
}
,HSV_OBJ:{
read:function(e){
return t.isNumber(e.h)&&t.isNumber(e.s)&&t.isNumber(e.v)?{
space:"HSV",h:e.h,s:e.s,v:e.v}
:!1}
,write:function(e){
return{
h:e.h,s:e.s,v:e.v}
}
}
}
}
];
return i}
),define("dat/color/math",[],function(){
var e;
return{
hsv_to_rgb:function(e,t,n){
var r=Math.floor(e/60)%6,i=e/60-Math.floor(e/60),s=n*(1-t),o=n*(1-i*t),u=n*(1-(1-i)*t),a=[[n,u,s],[o,n,s],[s,n,u],[s,o,n],[u,s,n],[n,s,o]][r];
return{
r:a[0]*255,g:a[1]*255,b:a[2]*255}
}
,rgb_to_hsv:function(e,t,n){
var r=Math.min(e,t,n),i=Math.max(e,t,n),s=i-r,o,u;
return i==0?{
h:NaN,s:0,v:0}
:(u=s/i,e==i?o=(t-n)/s:t==i?o=2+(n-e)/s:o=4+(e-t)/s,o/=6,o<0&&(o+=1),{
h:o*360,s:u,v:i/255}
)}
,rgb_to_hex:function(e,t,n){
var r=this.hex_with_component(0,2,e);
return r=this.hex_with_component(r,1,t),r=this.hex_with_component(r,0,n),r}
,component_from_hex:function(e,t){
return e>>t*8&255}
,hex_with_component:function(t,n,r){
return r<<(e=n*8)|t&~(255<<e)}
}
}
),define("dat/color/Color",["dat/color/interpret","dat/color/math","dat/color/toString","dat/utils/common"],function(e,t,n,r){
function s(e,t,n){
Object.defineProperty(e,t,{
get:function(){
return this.__state.space==="RGB"?this.__state[t]:(u(this,t,n),this.__state[t])}
,set:function(e){
this.__state.space!=="RGB"&&(u(this,t,n),this.__state.space="RGB"),this.__state[t]=e}
}
)}
function o(e,t){
Object.defineProperty(e,t,{
get:function(){
return this.__state.space==="HSV"?this.__state[t]:(a(this),this.__state[t])}
,set:function(e){
this.__state.space!=="HSV"&&(a(this),this.__state.space="HSV"),this.__state[t]=e}
}
)}
function u(e,n,i){
if(e.__state.space==="HEX")e.__state[n]=t.component_from_hex(e.__state.hex,i);
else{
if(e.__state.space!=="HSV")throw"Corrupted color state";
r.extend(e.__state,t.hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}
}
function a(e){
var n=t.rgb_to_hsv(e.r,e.g,e.b);
r.extend(e.__state,{
s:n.s,v:n.v}
),r.isNaN(n.h)?r.isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=n.h}
var i=function(){
this.__state=e.apply(this,arguments);
if(this.__state===!1)throw"Failed to interpret color arguments";
this.__state.a=this.__state.a||1}
;
return i.COMPONENTS=["r","g","b","h","s","v","hex","a"],r.extend(i.prototype,{
toString:function(){
return n(this)}
,toOriginal:function(){
return this.__state.conversion.write(this)}
}
),s(i.prototype,"r",2),s(i.prototype,"g",1),s(i.prototype,"b",0),o(i.prototype,"h"),o(i.prototype,"s"),o(i.prototype,"v"),Object.defineProperty(i.prototype,"a",{
get:function(){
return this.__state.a}
,set:function(e){
this.__state.a=e}
}
),Object.defineProperty(i.prototype,"hex",{
get:function(){
return!this.__state.space!=="HEX"&&(this.__state.hex=t.rgb_to_hex(this.r,this.g,this.b)),this.__state.hex}
,set:function(e){
this.__state.space="HEX",this.__state.hex=e}
}
),i}
),define("dat/controllers/ColorController",["dat/controllers/Controller","dat/dom/dom","dat/color/Color","dat/color/interpret","dat/utils/common"],function(e,t,n,r,i){
function u(e,t,n,r){
e.style.background="",i.each(o,function(i){
e.style.cssText+="background:"+i+"linear-gradient("+t+","+n+" 0%,"+r+" 100%);
"}
)}
function a(e){
e.style.background="",e.style.cssText+="background:-moz-linear-gradient(top,#ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);
",e.style.cssText+="background:-webkit-linear-gradient(top,#ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);
",e.style.cssText+="background:-o-linear-gradient(top,#ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);
",e.style.cssText+="background:-ms-linear-gradient(top,#ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);
",e.style.cssText+="background:linear-gradient(top,#ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);
"}
var s=function(e,o){
function c(e){
v(e),t.bind(window,"mousemove",v),t.bind(window,"mouseup",h)}
function h(){
t.unbind(window,"mousemove",v),t.unbind(window,"mouseup",h)}
function p(){
var e=r(this.value);
e!==!1?(f.__color.__state=e,f.setValue(f.__color.toOriginal())):this.value=f.__color.toString()}
function d(){
t.unbind(window,"mousemove",m),t.unbind(window,"mouseup",d)}
function v(e){
e.preventDefault();
var n=t.getWidth(f.__saturation_field),r=t.getOffset(f.__saturation_field),i=(e.clientX-r.left+document.body.scrollLeft)/n,s=1-(e.clientY-r.top+document.body.scrollTop)/n;
return s>1?s=1:s<0&&(s=0),i>1?i=1:i<0&&(i=0),f.__color.v=s,f.__color.s=i,f.setValue(f.__color.toOriginal()),!1}
function m(e){
e.preventDefault();
var n=t.getHeight(f.__hue_field),r=t.getOffset(f.__hue_field),i=1-(e.clientY-r.top+document.body.scrollTop)/n;
return i>1?i=1:i<0&&(i=0),f.__color.h=i*360,f.setValue(f.__color.toOriginal()),!1}
s.superclass.call(this,e,o),this.__color=new n(this.getValue()),this.__temp=new n(0);
var f=this;
this.domElement=document.createElement("div"),t.makeSelectable(this.domElement,!1),this.__selector=document.createElement("div"),this.__selector.className="selector",this.__saturation_field=document.createElement("div"),this.__saturation_field.className="saturation-field",this.__field_knob=document.createElement("div"),this.__field_knob.className="field-knob",this.__field_knob_border="2px solid ",this.__hue_knob=document.createElement("div"),this.__hue_knob.className="hue-knob",this.__hue_field=document.createElement("div"),this.__hue_field.className="hue-field",this.__input=document.createElement("input"),this.__input.type="text",this.__input_textShadow="0 1px 1px ",t.bind(this.__input,"keydown",function(e){
e.keyCode===13&&p.call(this)}
),t.bind(this.__input,"blur",p),t.bind(this.__selector,"mousedown",function(e){
t.addClass(this,"drag").bind(window,"mouseup",function(e){
t.removeClass(f.__selector,"drag")}
)}
);
var l=document.createElement("div");
i.extend(this.__selector.style,{
width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}
),i.extend(this.__field_knob.style,{
position:"absolute",width:"12px",height:"12px",border:this.__field_knob_border+(this.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}
),i.extend(this.__hue_knob.style,{
position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}
),i.extend(this.__saturation_field.style,{
width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}
),i.extend(l.style,{
width:"100%",height:"100%",background:"none"}
),u(l,"top","rgba(0,0,0,0)","#000"),i.extend(this.__hue_field.style,{
width:"15px",height:"100px",display:"inline-block",border:"1px solid #555",cursor:"ns-resize"}
),a(this.__hue_field),i.extend(this.__input.style,{
outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:this.__input_textShadow+"rgba(0,0,0,0.7)"}
),t.bind(this.__saturation_field,"mousedown",c),t.bind(this.__field_knob,"mousedown",c),t.bind(this.__hue_field,"mousedown",function(e){
m(e),t.bind(window,"mousemove",m),t.bind(window,"mouseup",d)}
),this.__saturation_field.appendChild(l),this.__selector.appendChild(this.__field_knob),this.__selector.appendChild(this.__saturation_field),this.__selector.appendChild(this.__hue_field),this.__hue_field.appendChild(this.__hue_knob),this.domElement.appendChild(this.__input),this.domElement.appendChild(this.__selector),this.updateDisplay()}
;
s.superclass=e,i.extend(s.prototype,e.prototype,{
updateDisplay:function(){
var e=r(this.getValue());
if(e!==!1){
var t=!1;
i.each(n.COMPONENTS,function(n){
if(!i.isUndefined(e[n])&&!i.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{
}
}
,this),t&&i.extend(this.__color.__state,e)}
i.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;
var s=this.__color.v<.5||this.__color.s>.5?255:0,o=255-s;
i.extend(this.__field_knob.style,{
marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toString(),border:this.__field_knob_border+"rgb("+s+","+s+","+s+")"}
),this.__hue_knob.style.marginTop=(1-this.__color.h/360)*100+"px",this.__temp.s=1,this.__temp.v=1,u(this.__saturation_field,"left","#fff",this.__temp.toString()),i.extend(this.__input.style,{
backgroundColor:this.__input.value=this.__color.toString(),color:"rgb("+s+","+s+","+s+")",textShadow:this.__input_textShadow+"rgba("+o+","+o+","+o+",.7)"}
)}
}
);
var o=["-moz-","-o-","-webkit-","-ms-",""];
return s}
),define("dat/utils/requestAnimationFrame",[],function(){
return window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e,t){
window.setTimeout(e,1e3/60)}
}
),define("dat/dom/CenteredDiv",["dat/dom/dom","dat/utils/common"],function(e,t){
function r(e){
console.log(e)}
var n=function(){
this.backgroundElement=document.createElement("div"),t.extend(this.backgroundElement.style,{
backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear"}
),e.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),t.extend(this.domElement.style,{
position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out,opacity 0.2s linear"}
),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);
var n=this;
e.bind(this.backgroundElement,"click",function(){
n.hide()}
)}
;
return n.prototype.show=function(){
var e=this;
this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),t.defer(function(){
e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"}
)}
,n.prototype.hide=function(){
var t=this,n=function(){
t.domElement.style.display="none",t.backgroundElement.style.display="none",e.unbind(t.domElement,"webkitTransitionEnd",n),e.unbind(t.domElement,"transitionend",n),e.unbind(t.domElement,"oTransitionEnd",n)}
;
e.bind(this.domElement,"webkitTransitionEnd",n),e.bind(this.domElement,"transitionend",n),e.bind(this.domElement,"oTransitionEnd",n),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}
,n.prototype.layout=function(){
this.domElement.style.left=window.innerWidth/2-e.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-e.getHeight(this.domElement)/2+"px"}
,n}
),define("dat/gui/GUI",["dat/utils/css","text!dat/gui/saveDialogue.html","text!dat/gui/style.css","dat/controllers/factory","dat/controllers/Controller","dat/controllers/BooleanController","dat/controllers/FunctionController","dat/controllers/NumberControllerBox","dat/controllers/NumberControllerSlider","dat/controllers/OptionController","dat/controllers/ColorController","dat/utils/requestAnimationFrame","dat/dom/CenteredDiv","dat/dom/dom","dat/utils/common"],function(e,t,n,r,i,s,o,u,a,f,l,c,h,p,d){
function C(e,t,n,s){
if(t[n]===undefined)throw new Error("Object "+t+' has no property "'+n+'"');
var o;
if(s.color)o=new l(t,n);
else{
var u=[t,n].concat(s.factoryArgs);
o=r.apply(e,u)}
s.before instanceof i&&(s.before=s.before.__li),A(e,o),p.addClass(o.domElement,"c");
var a=document.createElement("span");
p.addClass(a,"property-name"),a.innerHTML=o.property;
var f=document.createElement("div");
f.appendChild(a),f.appendChild(o.domElement);
var c=k(e,f,s.before);
return p.addClass(c,N.CLASS_CONTROLLER_ROW),p.addClass(c,typeof o.getValue()),L(e,c,o),e.__controllers.push(o),o}
function k(e,t,n){
var r=document.createElement("li");
return t&&r.appendChild(t),n?e.__ul.insertBefore(r,params.before):e.__ul.appendChild(r),e.onResize(),r}
function L(e,t,n){
n.__li=t,n.__gui=e,d.extend(n,{
options:function(t){
if(arguments.length>1)return n.remove(),C(e,n.object,n.property,{
before:n.__li.nextElementSibling,factoryArgs:[d.toArray(arguments)]}
);
if(d.isArray(t)||d.isObject(t))return n.remove(),C(e,n.object,n.property,{
before:n.__li.nextElementSibling,factoryArgs:[t]}
)}
,name:function(e){
return n.__li.firstElementChild.firstElementChild.innerHTML=e,n}
,listen:function(){
return n.__gui.listen(n),n}
,remove:function(){
return n.__gui.remove(n),n}
}
);
if(n instanceof a){
var r=new u(n.object,n.property,{
min:n.__min,max:n.__max,step:n.__step}
);
d.each(["updateDisplay","onChange","onFinishChange"],function(e){
var t=n[e],i=r[e];
n[e]=r[e]=function(){
var e=Array.prototype.slice.call(arguments);
return t.apply(n,e),i.apply(r,e)}
}
),p.addClass(t,"has-slider"),n.domElement.insertBefore(r.domElement,n.domElement.firstElementChild)}
else if(n instanceof u){
var i=function(t){
return d.isNumber(n.__min)&&d.isNumber(n.__max)?(n.remove(),C(e,n.object,n.property,{
before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]}
)):t}
;
n.min=d.compose(i,n.min),n.max=d.compose(i,n.max)}
else n instanceof s?(p.bind(t,"click",function(){
p.fakeEvent(n.__checkbox,"click")}
),p.bind(n.__checkbox,"click",function(e){
e.stopPropagation()}
)):n instanceof o?(p.bind(t,"click",function(){
p.fakeEvent(n.__button,"click")}
),p.bind(t,"mouseover",function(){
p.addClass(n.__button,"hover")}
),p.bind(t,"mouseout",function(){
p.removeClass(n.__button,"hover")}
)):n instanceof l&&(p.addClass(t,"color"),n.updateDisplay=d.compose(function(e){
return t.style.borderLeftColor=n.__color.toString(),e}
,n.updateDisplay),n.updateDisplay());
n.setValue=d.compose(function(t){
return e.getRoot().__preset_select&&n.isModified()&&j(e.getRoot(),!0),t}
,n.setValue)}
function A(e,t){
var n=e.getRoot(),r=n.__rememberedObjects.indexOf(t.object);
if(r!=-1){
var i=n.__rememberedObjectIndecesToControllers[r];
i===undefined&&(i={
}
,n.__rememberedObjectIndecesToControllers[r]=i),i[t.property]=t;
if(n.load&&n.load.remembered){
var s=n.load.remembered,o;
if(s[e.preset])o=s[e.preset];
else{
if(!s[y])return;
o=s[y]}
if(o[r]&&o[r][t.property]!==undefined){
var u=o[r][t.property];
t.initialValue=u,t.setValue(u)}
}
}
}
function O(e,t){
return document.location.href+"."+t}
function M(e){
var t=e.__save_row=document.createElement("li");
p.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),p.addClass(t,"save-row");
var n=document.createElement("span");
n.innerHTML="
",p.addClass(n,"button gears");
var r=document.createElement("span");
r.innerHTML="Save",p.addClass(r,"button"),p.addClass(r,"save");
var i=document.createElement("span");
i.innerHTML="New",p.addClass(i,"button"),p.addClass(i,"save-as");
var s=document.createElement("span");
s.innerHTML="Revert",p.addClass(s,"button"),p.addClass(s,"revert");
var o=e.__preset_select=document.createElement("select");
e.load&&e.load.remembered?d.each(e.load.remembered,function(t,n){
H(e,n,n==e.preset)}
):H(e,y,!1),p.bind(o,"change",function(){
for(var t=0;
t<e.__preset_select.length;
t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;
e.preset=this.value}
),t.appendChild(o),t.appendChild(n),t.appendChild(r),t.appendChild(i),t.appendChild(s);
if(b){
var u=document.getElementById("dg-save-locally"),a=document.getElementById("dg-local-explain");
u.style.display="block";
var f=document.getElementById("dg-local-storage");
localStorage.getItem(O(e,"isLocal"))==="true"&&f.setAttribute("checked","checked");
function l(){
a.style.display=e.useLocalStorage?"block":"none"}
l(),p.bind(f,"change",function(){
e.useLocalStorage=!e.useLocalStorage,l()}
)}
var c=document.getElementById("dg-new-constructor");
p.bind(c,"keydown",function(e){
e.metaKey&&(e.which===67||e.keyCode==67)&&w.hide()}
),p.bind(n,"click",function(){
c.innerHTML=JSON.stringify(e.getSaveObject(),undefined,2),w.show(),c.focus(),c.select()}
),p.bind(r,"click",function(){
e.save()}
),p.bind(i,"click",function(){
var t=prompt("Enter a new preset name.");
t&&e.saveAs(t)}
),p.bind(s,"click",function(){
e.revert()}
)}
function _(e){
function n(n){
return n.preventDefault(),t=n.clientX,p.addClass(e.__closeButton,N.CLASS_DRAG),p.bind(window,"mousemove",r),p.bind(window,"mouseup",i),!1}
function r(n){
return n.preventDefault(),e.width+=t-n.clientX,e.onResize(),t=n.clientX,!1}
function i(){
p.removeClass(e.__closeButton,N.CLASS_DRAG),p.unbind(window,"mousemove",r),p.unbind(window,"mouseup",i)}
e.__resize_handle=document.createElement("div"),d.extend(e.__resize_handle.style,{
width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}
);
var t;
p.bind(e.__resize_handle,"mousedown",n),p.bind(e.__closeButton,"mousedown",n),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}
function D(e,t){
e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}
function P(e,t){
var n={
}
;
return d.each(e.__rememberedObjects,function(r,i){
var s={
}
,o=e.__rememberedObjectIndecesToControllers[i];
d.each(o,function(e,n){
s[n]=t?e.initialValue:e.getValue()}
),n[i]=s}
),n}
function H(e,t,n){
var r=document.createElement("option");
r.innerHTML=t,r.value=t,e.__preset_select.appendChild(r),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}
function B(e){
for(var t=0;
t<e.__preset_select.length;
t++)e.__preset_select[t].value==e.preset&&(e.__preset_select.selectedIndex=t)}
function j(e,t){
var n=e.__preset_select[e.__preset_select.selectedIndex];
t?n.innerHTML=n.value+"*":n.innerHTML=n.value}
function F(e){
e.length!=0&&c(function(){
F(e)}
),d.each(e,function(e){
e.updateDisplay()}
)}
e.inject(n);
var v="dg",m=72,g=20,y="Default",b=function(){
try{
return"localStorage"in window&&window.localStorage!==null}
catch(e){
return!1}
}
(),w,E=!0,S,x=!1,T=[],N=function(e){
function u(){
localStorage.setItem(O(t,"gui"),JSON.stringify(t.getSaveObject()))}
function f(){
var e=t.getRoot();
e.width+=1,d.defer(function(){
e.width-=1}
)}
var t=this;
this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),p.addClass(this.domElement,v),this.__folders={
}
,this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],e=e||{
}
,e=d.defaults(e,{
autoPlace:!0,width:N.DEFAULT_WIDTH}
),e=d.defaults(e,{
resizable:e.autoPlace,hideable:e.autoPlace}
),d.isUndefined(e.load)?e.load={
preset:y}
:e.preset&&(e.load.preset=e.preset),d.isUndefined(e.parent)&&e.hideable&&T.push(this),e.resizable=d.isUndefined(e.parent)&&e.resizable,e.autoPlace&&d.isUndefined(e.scrollable)&&(e.scrollable=!0);
var n=b&&localStorage.getItem(O(this,"isLocal"))==="true";
Object.defineProperties(this,{
parent:{
get:function(){
return e.parent}
}
,scrollable:{
get:function(){
return e.scrollable}
}
,autoPlace:{
get:function(){
return e.autoPlace}
}
,preset:{
get:function(){
return t.parent?t.getRoot().preset:e.load.preset}
,set:function(n){
t.parent?t.getRoot().preset=n:e.load.preset=n,B(this),t.revert()}
}
,width:{
get:function(){
return e.width}
,set:function(n){
e.width=n,D(t,n)}
}
,name:{
get:function(){
return e.name}
,set:function(t){
e.name=t,i&&(i.innerHTML=e.name)}
}
,closed:{
get:function(){
return e.closed}
,set:function(n){
e.closed=n,e.closed?p.addClass(t.__ul,N.CLASS_CLOSED):p.removeClass(t.__ul,N.CLASS_CLOSED),this.onResize(),t.__closeButton&&(t.__closeButton.innerHTML=n?N.TEXT_OPEN:N.TEXT_CLOSED)}
}
,load:{
get:function(){
return e.load}
}
,useLocalStorage:{
get:function(){
return n}
,set:function(e){
b&&(n=e,e?p.bind(window,"unload",u):p.unbind(window,"unload",u),localStorage.setItem(O(t,"isLocal"),e))}
}
}
);
if(d.isUndefined(e.parent)){
e.closed=!1,p.addClass(this.domElement,N.CLASS_MAIN),p.makeSelectable(this.domElement,!1);
if(b&&n){
t.useLocalStorage=!0;
var r=localStorage.getItem(O(this,"gui"));
r&&(e.load=JSON.parse(r))}
this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=N.TEXT_CLOSED,p.addClass(this.__closeButton,N.CLASS_CLOSE_BUTTON),this.domElement.appendChild(this.__closeButton),p.bind(this.__closeButton,"click",function(){
t.closed=!t.closed}
)}
else{
e.closed===undefined&&(e.closed=!0);
var i=document.createTextNode(e.name);
p.addClass(i,"controller-name");
var s=k(t,i),o=function(e){
return e.preventDefault(),t.closed=!t.closed,!1}
;
p.addClass(this.__ul,N.CLASS_CLOSED),p.addClass(s,"title"),p.bind(s,"click",o),e.closed||(this.closed=!1)}
e.autoPlace&&(d.isUndefined(e.parent)&&(E&&(S=document.createElement("div"),p.addClass(S,v),p.addClass(S,N.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(S),E=!1),S.appendChild(this.domElement),p.addClass(this.domElement,N.CLASS_AUTO_PLACE)),this.parent||D(t,e.width)),p.bind(window,"resize",function(){
t.onResize()}
),p.bind(this.__ul,"webkitTransitionEnd",function(){
t.onResize()}
),p.bind(this.__ul,"transitionend",function(){
t.onResize()}
),p.bind(this.__ul,"oTransitionEnd",function(){
t.onResize()}
),this.onResize(),e.resizable&&_(this);
var a=t.getRoot();
e.parent||f()}
;
return N.toggleHide=function(){
x=!x,d.each(T,function(e){
e.domElement.style.zIndex=x?-999:999,e.domElement.style.opacity=x?0:1}
)}
,N.CLASS_AUTO_PLACE="a",N.CLASS_AUTO_PLACE_CONTAINER="ac",N.CLASS_MAIN="main",N.CLASS_CONTROLLER_ROW="cr",N.CLASS_TOO_TALL="taller-than-window",N.CLASS_CLOSED="closed",N.CLASS_CLOSE_BUTTON="close-button",N.CLASS_DRAG="drag",N.DEFAULT_WIDTH=245,N.TEXT_CLOSED="Close Controls",N.TEXT_OPEN="Open Controls",p.bind(window,"keydown",function(e){
document.activeElement.type!=="text"&&(e.which===m||e.keyCode==m)&&N.toggleHide()}
,!1),d.extend(N.prototype,{
add:function(e,t){
return C(this,e,t,{
factoryArgs:Array.prototype.slice.call(arguments,2)}
)}
,addColor:function(e,t){
return C(this,e,t,{
color:!0}
)}
,remove:function(e){
this.__ul.removeChild(e.__li),this.__controllers.slice(this.__controllers.indexOf(e),1);
var t=this;
d.defer(function(){
t.onResize()}
)}
,destroy:function(){
this.autoPlace&&S.removeChild(this.domElement)}
,addFolder:function(e){
if(this.__folders[e]!==undefined)throw new Error('You already have a folder in this GUI by the name "'+e+'"');
var t={
name:e,parent:this}
;
t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);
var n=new N(t);
this.__folders[e]=n;
var r=k(this,n.domElement);
return p.addClass(r,"folder"),n}
,open:function(){
this.closed=!1}
,close:function(){
this.closed=!0}
,onResize:function(){
var e=this.getRoot();
if(e.scrollable){
var t=p.getOffset(e.__ul).top,n=0;
d.each(e.__ul.childNodes,function(t){
if(!e.autoPlace||t!==e.__save_row)n+=p.getHeight(t)}
),window.innerHeight-t-g<n?(p.addClass(e.domElement,N.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-g+"px"):(p.removeClass(e.domElement,N.CLASS_TOO_TALL),e.__ul.style.height="auto")}
e.__resize_handle&&d.defer(function(){
e.__resize_handle.style.height=e.__ul.offsetHeight+"px"}
),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")}
,remember:function(){
d.isUndefined(w)&&(w=new h,w.domElement.innerHTML=t);
if(this.parent)throw new Error("You can only call remember on a top level GUI.");
var e=this;
d.each(Array.prototype.slice.call(arguments),function(t){
e.__rememberedObjects.length==0&&M(e),e.__rememberedObjects.indexOf(t)==-1&&e.__rememberedObjects.push(t)}
),this.autoPlace&&D(this,this.width)}
,getRoot:function(){
var e=this;
while(e.parent)e=e.parent;
return e}
,getSaveObject:function(){
var e=this.load;
return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={
}
),e.remembered[this.preset]=P(this)),e.folders={
}
,d.each(this.__folders,function(t,n){
e.folders[n]=t.getSaveObject()}
),e}
,save:function(){
this.load.remembered||(this.load.remembered={
}
),this.load.remembered[this.preset]=P(this),j(this,!1)}
,saveAs:function(e){
this.load.remembered||(this.load.remembered={
}
,this.load.remembered[y]=P(this,!0)),this.load.remembered[e]=P(this),this.preset=e,H(this,e,!0)}
,revert:function(e){
d.each(this.__controllers,function(t){
this.getRoot().load.remembered?A(e||this.getRoot(),t):t.setValue(t.initialValue)}
,this),d.each(this.__folders,function(e){
e.revert(e)}
),e||j(this.getRoot(),!1)}
,listen:function(e){
var t=this.__listening.length==0;
this.__listening.push(e),t&&F(this.__listening)}
}
),N}
),define("hair/config/controllers",[],function(){
return{
}
}
),define("hair/config/options",["dat/gui/GUI","hair/config/controllers"],function(e,t){
var n=new e,r={
amount:15,length:50,thickness:20,type:"face",suction:!1,color:"#642222"}
;
return n.close(),t.amount=n.add(r,"amount",5,40),t.length=n.add(r,"length",20,200),t.thickness=n.add(r,"thickness",4,30),t.type=n.add(r,"type",["face","circle","flat"]),t.suction=n.add(r,"suction").name("Inverse"),t.color=n.addColor(r,"color"),r}
),define("hair/Joint",["suds/math/Point","suds/ui/Motion","hair/config/options"],function(e,t,n){
var r=e.extend({
predecessor:null,force:null,distance:null,motion:null,successor:null,initialize:function(r,i){
var s,o;
this.predecessor=r,this.index=i,this.distance=n.length,this.motion=new t(5,2,10),r?(s=r.x+this.distance,o=r.y):(s=0,o=0),this._super(s,o),this.top=(new e).set(this),this.bottom=(new e).set(this)}
,update:function(){
var t=this.index*n.thickness;
if(this.successor){
var r=e.between(this,this.successor).normalize().multiply(t);
this.top=r.clone().rotate(Math.PI/2),this.bottom=r.clone().rotate(-Math.PI/2);
return}
if(!this.predecessor)return;
this.motion.update();
var i=this.force.clone().add(this.motion.getPosition());
this.add(i);
var r=e.between(this.predecessor,this).normalize(),s=r.clone().multiply(n.length),o=this.predecessor.clone().add(s);
this.x=o.x,this.y=o.y,this.top=this.clone().add(r.clone().multiply(t).rotate(Math.PI/2)),this.bottom=this.clone().add(r.clone().multiply(t).rotate(-Math.PI/2))}
}
);
return r}
),define("hair/utils/bezier",[],function(){
return function(e,t,n){
var r,i,s,o;
for(var u=1,a=e.length-2;
u<a;
u++)r=e[u][n],i=e[u+1][n],s=(r.x+i.x)*.5,o=(r.y+i.y)*.5,t.quadraticCurveTo(r.x,r.y,s,o);
r=e[u][n],i=e[u+1][n],t.quadraticCurveTo(r.x,r.y,i.x,i.y)}
}
),define("hair/utils/reverse",[],function(){
return function(e){
var t=[];
for(var n=0;
n<e.length;
n++)t.push(e[n]);
return t.reverse(),t}
}
),define("hair/Hair",["suds/math/Point","hair/Joint","hair/utils/bezier","hair/utils/reverse","hair/config/options"],function(e,t,n,r,i){
var s=function(s){
function f(){
var e,n=5;
for(var r=0;
r<n;
r++)e=new t(e,(n-r)/n),e.force=a,o.push(e);
o[0].successor=o[1]}
var o=[],u=25,a=new e;
this.draw=function(t){
var u=o.length,a=o[0];
t.save(),t.beginPath(),t.strokeStyle="rgb( 0,0,0 )",t.fillStyle=i.color,t.lineWidth=2,t.translate(s.x,s.y);
for(var f=0;
f<u;
f++)o[f].update();
t.moveTo(a.top.x,a.top.y),n(o,t,"top"),n(r(o),t,"bottom");
var l=e.between(a,a.top),c=e.between(a,a.bottom);
t.arc(a.x,a.y,i.thickness,Math.atan2(c.y,c.x),Math.atan2(l.y,l.x),!0),t.closePath(),t.fill(),t.stroke(),t.restore()}
,this.getOrigin=function(){
return s}
,this.setOrigin=function(e){
s.set(e)}
,this.setForce=function(e){
a.set(e)}
,f()}
;
return s}
),define("hair/utils/polarToCartesian",["suds/math/Point"],function(e){
return function(n,r){
return new e(r*Math.cos(n),r*Math.sin(n))}
}
),define("hair/utils/circleOrder",[],function(){
return function(e,t){
function s(e){
return(t+e)%n}
var n=e.length,r=[],i=0;
j=n-1;
while(i<=j)r.unshift(e[s(i)]),i!=j&&r.unshift(e[s(j)]),i++,j--;
return r}
}
),define("hair/utils/faceOrder",[],function(){
return function(e,t){
var n=e.length,r=[],i=1,s=1;
r.unshift(e[t]);
while(i>-1||s>-1)i>-1&&(t+i>n-1?i=-1:(r.unshift(e[t+i]),i++)),s>-1&&(t-s<0?s=-1:(r.unshift(e[t-s]),s++));
return r}
}
),define("hair/utils/linear",[],function(){
return function(e,t,n){
return(e-t)/(n-t)}
}
),define("hair/App",["suds/events/Interval","suds/helpers/MouseHelper","suds/math/Point","hair/Hair","hair/utils/polarToCartesian","hair/utils/circleOrder","hair/utils/faceOrder","hair/utils/linear","hair/config/options","hair/config/controllers"],function(e,t,n,r,i,s,o,u,a,f){
"use strict";
var l=function(){
function v(){
e.addListener(e.FRAME,y),t.startTracking(),l=document.getElementById("canvas"),c=l.getContext("2d"),p=l.width=window.innerWidth,d=l.height=window.innerHeight,m(),f.amount.onFinishChange(m),f.type.onFinishChange(g),window.addEventListener("resize",function(){
p=l.width=window.innerWidth,d=l.height=window.innerHeight,g()}
)}
function m(){
var e=a.amount,t,i;
h=[];
for(var s=0;
s<e;
s++)i=new r(new n),h.push(i);
g()}
function g(){
var e=new n(p/2,d/2),t=h.length,r,s,o;
switch(a.type){
case"circle":for(var r=0;
r<t;
r++)s=h[r],o=i(Math.PI*2*(r/t),100).add(e),s.setOrigin(o);
break;
case"flat":var u=p*3*.25,f=(p-u)*.5,l=u/t,c=d*.5;
for(var r=0;
r<t;
r++)s=h[r],o=new n(f+r*l,c),s.setOrigin(o);
break;
case"face":var v;
for(var r=0;
r<t;
r++)s=h[r],v=-Math.PI*.1-Math.PI*.8*(r/(t-1)),o=i(v,100).add(e),s.setOrigin(o)}
}
function y(){
l.width=p;
var e=new n(p/2,d/2),r=n.between(t,e),i=Math.atan2(r.y,r.x),f=(Math.PI+i)/(Math.PI*2),v,m;
a.type==="face"?(b(),f>.5&&f<1?(f=u(f,.5,1),v=~~((1-f)*(h.length-1))):(f=u(f,0,.5),v=~~(f*(h.length-1))),m=o(h,v)):(v=~~(f*(h.length-1)),m=s(h,v));
var g,y;
for(var w=0,E=m.length;
w<E;
w++)g=m[w],y=n.between(t,g.getOrigin()).normalize().multiply(20),a.suction&&y.flip(),g.setForce(y),g.draw(c)}
function b(){
c.beginPath(),c.strokeStyle="rgb( 0,0,0 )",c.fillStyle="rgb( 255,255,255 )",c.lineWidth=2,c.arc(p/2,d/2,100,0,Math.PI,!0),c.closePath(),c.fill(),c.stroke(),c.beginPath(),c.fillStyle="rgb( 0,0,0 )",c.arc(p/2-30,d/2-20,7,0,Math.PI*2),c.closePath(),c.fill(),c.beginPath(),c.fillStyle="rgb( 0,0,0 )",c.arc(p/2+30,d/2-20,7,0,Math.PI*2),c.closePath(),c.fill(),c.beginPath(),c.moveTo(0,d/2),c.lineTo(p,d/2),c.stroke(),c.fillStyle="rgb( 255,255,255 )",w(),E()}
function w(){
var e=p/2-200;
S(e),S(e+15),S(e+30)}
function E(){
var e=p/2+200;
S(e),S(e-15),S(e-30)}
function S(e){
c.beginPath(),c.arc(e,d/2,10,0,Math.PI*2),c.closePath(),c.fill(),c.stroke()}
var l=null,c=null,h=null,p=0,d=0;
v()}
;
return l}
),require.config({
urlArgs:"bust="+Date.now(),paths:{
suds:"libs/suds/source",dat:"libs/dat",text:"libs/require/plugin.text"}
}
),require(["hair/App"],function(e){
function r(){
t.className="before in",setTimeout(function(){
t.className=""}
,300)}
var t=document.getElementById("tag"),n=new e;
r()}
),define("main",function(){
}
);
CSS代码(style.css):
@import url(http://fonts.googleapis.com/css?family=Quicksand);html,body{padding:0;margin:0;width:100%;height:100%;overflow:hidden;}
body{background:-moz-radial-gradient(#d45656,#c23131 100%);background:-webkit-radial-gradient(#d45656,#c23131 100%);background:radial-gradient(#d45656,#c23131 100%);}
canvas{width:100%;height:100%;}
#tag.before{width:0;left:0;padding:15px 0 0 0;}
#tag.before h1,#tag.before p,#tag.before ul,#tag.before span{opacity:0;-moz-transform:translate3d(-50px,0,0);-ms-transform:translate3d(-50px,0,0);-webkit-transform:translate3d(-50px,0,0);transform:translate3d(-50px,0,0);}
#tag.in{width:220px;}
#tag{-moz-transition:all 0.3s cubic-bezier(0.8,0,0.2,1);-o-transition:all 0.3s cubic-bezier(0.8,0,0.2,1);-webkit-transition:all 0.3s cubic-bezier(0.8,0,0.2,1);transition:all 0.3s cubic-bezier(0.8,0,0.2,1);position:fixed;width:180px;height:180px;top:20px;left:20px;font-family:"Quicksand",sans-serif;padding:15px 0 0 20px;background-color:#000;color:#fff;}
#tag h1,#tag p,#tag ul,#tag span{opacity:1;-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}
#tag h1{-moz-transition:all 0.3s ease-in-out 0.3s;-o-transition:all 0.3s ease-in-out 0.3s;-webkit-transition:all 0.3s ease-in-out;-webkit-transition-delay:0.3s;transition:all 0.3s ease-in-out 0.3s;font-size:30px;font-weight:400;margin:0;}
#tag p{-moz-transition:all 0.3s ease-in-out 0.4s;-o-transition:all 0.3s ease-in-out 0.4s;-webkit-transition:all 0.3s ease-in-out;-webkit-transition-delay:0.4s;transition:all 0.3s ease-in-out 0.4s;}
#tag ul{-moz-transition:all 0.3s ease-in-out 0.6s;-o-transition:all 0.3s ease-in-out 0.6s;-webkit-transition:all 0.3s ease-in-out;-webkit-transition-delay:0.6s;transition:all 0.3s ease-in-out 0.6s;}
#tag p,#tag ul a{font-size:12px;font-weight:700;}
#tag a{color:white;text-decoration:none;}
#tag a:hover{background-color:#333;color:white;border-bottom:1px solid #d45656;}
#tag span{-moz-transition:all 0.3s ease-in-out 0.7s;-o-transition:all 0.3s ease-in-out 0.7s;-webkit-transition:all 0.3s ease-in-out;-webkit-transition-delay:0.7s;transition:all 0.3s ease-in-out 0.7s;display:inline-block;margin-top:20px;font-size:10px;}
#tag ul{list-style:none;margin:0;padding:0;}