made with requirebin
Created
October 26, 2014 20:05
-
-
Save ahdinosaur/c25cd8ef79da8f35f302 to your computer and use it in GitHub Desktop.
requirebin sketch
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
// create graph: | |
var createGraph = require('ngraph.graph'); | |
var createSvg = require('ngraph.svg'); | |
var QS = require('query-string'); | |
var graphGenerators = require('ngraph.generators'); | |
function render (svg) { | |
var query = QS.parse(window.location.search.substring(1)); | |
var graph = getGraphFromQueryString(query); | |
var graphics = createSvg(graph, { | |
interactive: true, | |
}); | |
graphics.run(); | |
return graphics.svgRoot; | |
} | |
function getGraphFromQueryString(query) { | |
var createGraph = graphGenerators[query.graph] || graphGenerators.grid; | |
return createGraph(getNumber(query.n), getNumber(query.m), getNumber(query.k)); | |
} | |
function getNumber(string, defaultValue) { | |
var number = parseFloat(string); | |
return (typeof number === 'number') && !isNaN(number) ? number : (defaultValue || 10); | |
} | |
var svg; | |
function draw () { | |
if (!svg) { | |
svg = render(); | |
} | |
svg.setAttribute('height', document.body.clientHeight); | |
svg.setAttribute('width', document.body.clientWidth); | |
} | |
window.addEventListener('resize', draw); | |
draw(); |
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
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents=Object.create(null);return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}var handlers=registeredEvents[eventName];if(!handlers){handlers=registeredEvents[eventName]=[]}handlers.push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents=Object.create(null);return subject}if(registeredEvents[eventName]){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var callbacks=registeredEvents[eventName];if(!callbacks){return subject}var fireArguments;if(arguments.length>1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],"ngraph.graph":[function(require,module,exports){module.exports=function(){var nodes=typeof Object.create==="function"?Object.create(null):{},links=[],multiEdges={},nodesCount=0,suspendEvents=0,changes=[],fireGraphChanged=function(graph){graph.fire("changed",changes)},enterModification=function(){suspendEvents+=1},exitModification=function(graph){suspendEvents-=1;if(suspendEvents===0&&changes.length>0){fireGraphChanged(graph);changes.length=0}},recordNodeChange=function(node,changeType){changes.push({node:node,changeType:changeType})},recordLinkChange=function(link,changeType){changes.push({link:link,changeType:changeType})},linkConnectionSymbol="👉 ";var graphPart={addNode:function(nodeId,data){if(typeof nodeId==="undefined"){throw new Error("Invalid node identifier")}enterModification();var node=this.getNode(nodeId);if(!node){node=new Node(nodeId);nodesCount++;recordNodeChange(node,"add")}else{recordNodeChange(node,"update")}node.data=data;nodes[nodeId]=node;exitModification(this);return node},addLink:function(fromId,toId,data){enterModification();var fromNode=this.getNode(fromId)||this.addNode(fromId);var toNode=this.getNode(toId)||this.addNode(toId);var linkId=fromId.toString()+linkConnectionSymbol+toId.toString();var isMultiEdge=multiEdges.hasOwnProperty(linkId);if(isMultiEdge||this.hasLink(fromId,toId)){if(!isMultiEdge){multiEdges[linkId]=0}linkId+="@"+ ++multiEdges[linkId]}var link=new Link(fromId,toId,data,linkId);links.push(link);fromNode.links.push(link);toNode.links.push(link);recordLinkChange(link,"add");exitModification(this);return link},removeLink:function(link){if(!link){return false}var idx=indexOfElementInArray(link,links);if(idx<0){return false}enterModification();links.splice(idx,1);var fromNode=this.getNode(link.fromId);var toNode=this.getNode(link.toId);if(fromNode){idx=indexOfElementInArray(link,fromNode.links);if(idx>=0){fromNode.links.splice(idx,1)}}if(toNode){idx=indexOfElementInArray(link,toNode.links);if(idx>=0){toNode.links.splice(idx,1)}}recordLinkChange(link,"remove");exitModification(this);return true},removeNode:function(nodeId){var node=this.getNode(nodeId);if(!node){return false}enterModification();while(node.links.length){var link=node.links[0];this.removeLink(link)}delete nodes[nodeId];nodesCount--;recordNodeChange(node,"remove");exitModification(this);return true},getNode:function(nodeId){return nodes[nodeId]},getNodesCount:function(){return nodesCount},getLinksCount:function(){return links.length},getLinks:function(nodeId){var node=this.getNode(nodeId);return node?node.links:null},forEachNode:function(callback){if(typeof callback!=="function"){return}var node;for(node in nodes){if(callback(nodes[node])){return}}},forEachLinkedNode:function(nodeId,callback,oriented){var node=this.getNode(nodeId),i,link,linkedNodeId;if(node&&node.links&&typeof callback==="function"){if(oriented){for(i=0;i<node.links.length;++i){link=node.links[i];if(link.fromId===nodeId){callback(nodes[link.toId],link)}}}else{for(i=0;i<node.links.length;++i){link=node.links[i];linkedNodeId=link.fromId===nodeId?link.toId:link.fromId;callback(nodes[linkedNodeId],link)}}}},forEachLink:function(callback){var i,length;if(typeof callback==="function"){for(i=0,length=links.length;i<length;++i){callback(links[i])}}},beginUpdate:function(){enterModification()},endUpdate:function(){exitModification(this)},clear:function(){var that=this;that.beginUpdate();that.forEachNode(function(node){that.removeNode(node.id)});that.endUpdate()},hasLink:function(fromNodeId,toNodeId){var node=this.getNode(fromNodeId),i;if(!node){return null}for(i=0;i<node.links.length;++i){var link=node.links[i];if(link.fromId===fromNodeId&&link.toId===toNodeId){return link}}return null}};var eventify=require("ngraph.events");eventify(graphPart);return graphPart};function indexOfElementInArray(element,array){if(array.indexOf){return array.indexOf(element)}var len=array.length,i;for(i=0;i<len;i+=1){if(array[i]===element){return i}}return-1}function Node(id){this.id=id;this.links=[];this.data=null}function Link(fromId,toId,data,id){this.fromId=fromId;this.toId=toId;this.data=data;this.id=id}},{"ngraph.events":1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var merge=require("ngraph.merge");module.exports=getDefaultLayout;function getDefaultLayout(graph,settings){if(settings.layout)return settings.layout;settings=merge(settings,{physics:{springLength:30,springCoeff:8e-4,dragCoeff:.01,gravity:-1.2,theta:1}});var createLayout=require("ngraph.forcelayout");var physics=require("ngraph.physics.simulator");return createLayout(graph,physics(settings.physics))}},{"ngraph.forcelayout":5,"ngraph.merge":7,"ngraph.physics.simulator":8}],2:[function(require,module,exports){var svg=require("simplesvg");exports.nodeBuilder=nodeBuilder;exports.nodePositionCallback=nodePositionCallback;exports.linkBuilder=linkBuilder;exports.linkPositionCallback=linkPositionCallback;function nodeBuilder(node){return svg("rect").attr("width",10).attr("height",10).attr("fill","#00a2e8")}function nodePositionCallback(nodeUI,pos){nodeUI.attr("x",pos.x-5).attr("y",pos.y-5)}function linkBuilder(linkUI,pos){return svg("line").attr("stroke","#999")}function linkPositionCallback(linkUI,fromPos,toPos){linkUI.attr("x1",fromPos.x).attr("y1",fromPos.y).attr("x2",toPos.x).attr("y2",toPos.y)}},{simplesvg:22}],3:[function(require,module,exports){(function(window,document,exportName,undefined){"use strict";var VENDOR_PREFIXES=["","webkit","moz","MS","ms","o"];var TEST_ELEMENT=document.createElement("div");var TYPE_FUNCTION="function";var round=Math.round;var abs=Math.abs;var now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){if(Array.isArray(arg)){each(arg,context[fn],context);return true}return false}function each(obj,iterator,context){var i;if(!obj){return}if(obj.forEach){obj.forEach(iterator,context)}else if(obj.length!==undefined){i=0;while(i<obj.length){iterator.call(context,obj[i],i,obj);i++}}else{for(i in obj){obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}}}function extend(dest,src,merge){var keys=Object.keys(src);var i=0;while(i<keys.length){if(!merge||merge&&dest[keys[i]]===undefined){dest[keys[i]]=src[keys[i]]}i++}return dest}function merge(dest,src){return extend(dest,src,true)}function inherit(child,base,properties){var baseP=base.prototype,childP;childP=child.prototype=Object.create(baseP);childP.constructor=child;childP._super=baseP;if(properties){extend(childP,properties)}}function bindFn(fn,context){return function boundFn(){return fn.apply(context,arguments)}}function boolOrFn(val,args){if(typeof val==TYPE_FUNCTION){return val.apply(args?args[0]||undefined:undefined,args)}return val}function ifUndefined(val1,val2){return val1===undefined?val2:val1}function addEventListeners(target,types,handler){each(splitStr(types),function(type){target.addEventListener(type,handler,false)})}function removeEventListeners(target,types,handler){each(splitStr(types),function(type){target.removeEventListener(type,handler,false)})}function hasParent(node,parent){while(node){if(node==parent){return true}node=node.parentNode}return false}function inStr(str,find){return str.indexOf(find)>-1}function splitStr(str){return str.trim().split(/\s+/g)}function inArray(src,find,findByKey){if(src.indexOf&&!findByKey){return src.indexOf(find)}else{var i=0;while(i<src.length){if(findByKey&&src[i][findByKey]==find||!findByKey&&src[i]===find){return i}i++}return-1}}function toArray(obj){return Array.prototype.slice.call(obj,0)}function uniqueArray(src,key,sort){var results=[];var values=[];var i=0;while(i<src.length){var val=key?src[i][key]:src[i];if(inArray(values,val)<0){results.push(src[i])}values[i]=val;i++}if(sort){if(!key){results=results.sort()}else{results=results.sort(function sortUniqueArray(a,b){return a[key]>b[key]})}}return results}function prefixed(obj,property){var prefix,prop;var camelProp=property[0].toUpperCase()+property.slice(1);var i=0;while(i<VENDOR_PREFIXES.length){prefix=VENDOR_PREFIXES[i];prop=prefix?prefix+camelProp:property;if(prop in obj){return prop}i++}return undefined}var _uniqueId=1;function uniqueId(){return _uniqueId++}function getWindowForElement(element){var doc=element.ownerDocument;return doc.defaultView||doc.parentWindow}var MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i;var SUPPORT_TOUCH="ontouchstart"in window;var SUPPORT_POINTER_EVENTS=prefixed(window,"PointerEvent")!==undefined;var SUPPORT_ONLY_TOUCH=SUPPORT_TOUCH&&MOBILE_REGEX.test(navigator.userAgent);var INPUT_TYPE_TOUCH="touch";var INPUT_TYPE_PEN="pen";var INPUT_TYPE_MOUSE="mouse";var INPUT_TYPE_KINECT="kinect";var COMPUTE_INTERVAL=25;var INPUT_START=1;var INPUT_MOVE=2;var INPUT_END=4;var INPUT_CANCEL=8;var DIRECTION_NONE=1;var DIRECTION_LEFT=2;var DIRECTION_RIGHT=4;var DIRECTION_UP=8;var DIRECTION_DOWN=16;var DIRECTION_HORIZONTAL=DIRECTION_LEFT|DIRECTION_RIGHT;var DIRECTION_VERTICAL=DIRECTION_UP|DIRECTION_DOWN;var DIRECTION_ALL=DIRECTION_HORIZONTAL|DIRECTION_VERTICAL;var PROPS_XY=["x","y"];var PROPS_CLIENT_XY=["clientX","clientY"];function Input(manager,callback){var self=this;this.manager=manager;this.callback=callback;this.element=manager.element;this.target=manager.options.inputTarget;this.domHandler=function(ev){if(boolOrFn(manager.options.enable,[manager])){self.handler(ev)}};this.init()}Input.prototype={handler:function(){},init:function(){this.evEl&&addEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&addEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&addEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&removeEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&removeEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&removeEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)}};function createInputInstance(manager){var Type;var inputClass=manager.options.inputClass;if(inputClass){Type=inputClass}else if(SUPPORT_POINTER_EVENTS){Type=PointerEventInput}else if(SUPPORT_ONLY_TOUCH){Type=TouchInput}else if(!SUPPORT_TOUCH){Type=MouseInput}else{Type=TouchMouseInput}return new Type(manager,inputHandler)}function inputHandler(manager,eventType,input){var pointersLen=input.pointers.length;var changedPointersLen=input.changedPointers.length;var isFirst=eventType&INPUT_START&&pointersLen-changedPointersLen===0;var isFinal=eventType&(INPUT_END|INPUT_CANCEL)&&pointersLen-changedPointersLen===0;input.isFirst=!!isFirst;input.isFinal=!!isFinal;if(isFirst){manager.session={}}input.eventType=eventType;computeInputData(manager,input);manager.emit("hammer.input",input);manager.recognize(input);manager.session.prevInput=input}function computeInputData(manager,input){var session=manager.session;var pointers=input.pointers;var pointersLength=pointers.length;if(!session.firstInput){session.firstInput=simpleCloneInputData(input)}if(pointersLength>1&&!session.firstMultiple){session.firstMultiple=simpleCloneInputData(input)}else if(pointersLength===1){session.firstMultiple=false}var firstInput=session.firstInput;var firstMultiple=session.firstMultiple;var offsetCenter=firstMultiple?firstMultiple.center:firstInput.center;var center=input.center=getCenter(pointers);input.timeStamp=now();input.deltaTime=input.timeStamp-firstInput.timeStamp;input.angle=getAngle(offsetCenter,center);input.distance=getDistance(offsetCenter,center);computeDeltaXY(session,input);input.offsetDirection=getDirection(input.deltaX,input.deltaY);input.scale=firstMultiple?getScale(firstMultiple.pointers,pointers):1;input.rotation=firstMultiple?getRotation(firstMultiple.pointers,pointers):0;computeIntervalInputData(session,input);var target=manager.element;if(hasParent(input.srcEvent.target,target)){target=input.srcEvent.target}input.target=target}function computeDeltaXY(session,input){var center=input.center;var offset=session.offsetDelta||{};var prevDelta=session.prevDelta||{};var prevInput=session.prevInput||{};if(input.eventType===INPUT_START||prevInput.eventType===INPUT_END){prevDelta=session.prevDelta={x:prevInput.deltaX||0,y:prevInput.deltaY||0};offset=session.offsetDelta={x:center.x,y:center.y}}input.deltaX=prevDelta.x+(center.x-offset.x);input.deltaY=prevDelta.y+(center.y-offset.y)}function computeIntervalInputData(session,input){var last=session.lastInterval||input,deltaTime=input.timeStamp-last.timeStamp,velocity,velocityX,velocityY,direction;if(input.eventType!=INPUT_CANCEL&&(deltaTime>COMPUTE_INTERVAL||last.velocity===undefined)){var deltaX=last.deltaX-input.deltaX;var deltaY=last.deltaY-input.deltaY;var v=getVelocity(deltaTime,deltaX,deltaY);velocityX=v.x;velocityY=v.y;velocity=abs(v.x)>abs(v.y)?v.x:v.y;direction=getDirection(deltaX,deltaY);session.lastInterval=input}else{velocity=last.velocity;velocityX=last.velocityX;velocityY=last.velocityY;direction=last.direction}input.velocity=velocity;input.velocityX=velocityX;input.velocityY=velocityY;input.direction=direction}function simpleCloneInputData(input){var pointers=[];var i=0;while(i<input.pointers.length){pointers[i]={clientX:round(input.pointers[i].clientX),clientY:round(input.pointers[i].clientY)};i++}return{timeStamp:now(),pointers:pointers,center:getCenter(pointers),deltaX:input.deltaX,deltaY:input.deltaY}}function getCenter(pointers){var pointersLength=pointers.length;if(pointersLength===1){return{x:round(pointers[0].clientX),y:round(pointers[0].clientY)}}var x=0,y=0,i=0;while(i<pointersLength){x+=pointers[i].clientX;y+=pointers[i].clientY;i++}return{x:round(x/pointersLength),y:round(y/pointersLength)}}function getVelocity(deltaTime,x,y){return{x:x/deltaTime||0,y:y/deltaTime||0}}function getDirection(x,y){if(x===y){return DIRECTION_NONE}if(abs(x)>=abs(y)){return x>0?DIRECTION_LEFT:DIRECTION_RIGHT}return y>0?DIRECTION_UP:DIRECTION_DOWN}function getDistance(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.sqrt(x*x+y*y)}function getAngle(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.atan2(y,x)*180/Math.PI}function getRotation(start,end){return getAngle(end[1],end[0],PROPS_CLIENT_XY)-getAngle(start[1],start[0],PROPS_CLIENT_XY)}function getScale(start,end){return getDistance(end[0],end[1],PROPS_CLIENT_XY)/getDistance(start[0],start[1],PROPS_CLIENT_XY)}var MOUSE_INPUT_MAP={mousedown:INPUT_START,mousemove:INPUT_MOVE,mouseup:INPUT_END};var MOUSE_ELEMENT_EVENTS="mousedown";var MOUSE_WINDOW_EVENTS="mousemove mouseup";function MouseInput(){this.evEl=MOUSE_ELEMENT_EVENTS;this.evWin=MOUSE_WINDOW_EVENTS;this.allow=true;this.pressed=false;Input.apply(this,arguments)}inherit(MouseInput,Input,{handler:function MEhandler(ev){var eventType=MOUSE_INPUT_MAP[ev.type];if(eventType&INPUT_START&&ev.button===0){this.pressed=true}if(eventType&INPUT_MOVE&&ev.which!==1){eventType=INPUT_END}if(!this.pressed||!this.allow){return}if(eventType&INPUT_END){this.pressed=false}this.callback(this.manager,eventType,{pointers:[ev],changedPointers:[ev],pointerType:INPUT_TYPE_MOUSE,srcEvent:ev})}});var POINTER_INPUT_MAP={pointerdown:INPUT_START,pointermove:INPUT_MOVE,pointerup:INPUT_END,pointercancel:INPUT_CANCEL,pointerout:INPUT_CANCEL};var IE10_POINTER_TYPE_ENUM={2:INPUT_TYPE_TOUCH,3:INPUT_TYPE_PEN,4:INPUT_TYPE_MOUSE,5:INPUT_TYPE_KINECT};var POINTER_ELEMENT_EVENTS="pointerdown";var POINTER_WINDOW_EVENTS="pointermove pointerup pointercancel";if(window.MSPointerEvent){POINTER_ELEMENT_EVENTS="MSPointerDown";POINTER_WINDOW_EVENTS="MSPointerMove MSPointerUp MSPointerCancel"}function PointerEventInput(){this.evEl=POINTER_ELEMENT_EVENTS;this.evWin=POINTER_WINDOW_EVENTS;Input.apply(this,arguments);this.store=this.manager.session.pointerEvents=[]}inherit(PointerEventInput,Input,{handler:function PEhandler(ev){var store=this.store;var removePointer=false;var eventTypeNormalized=ev.type.toLowerCase().replace("ms","");var eventType=POINTER_INPUT_MAP[eventTypeNormalized];var pointerType=IE10_POINTER_TYPE_ENUM[ev.pointerType]||ev.pointerType;var isTouch=pointerType==INPUT_TYPE_TOUCH;var storeIndex=inArray(store,ev.pointerId,"pointerId");if(eventType&INPUT_START&&(ev.button===0||isTouch)){if(storeIndex<0){store.push(ev);storeIndex=store.length-1}}else if(eventType&(INPUT_END|INPUT_CANCEL)){removePointer=true}if(storeIndex<0){return}store[storeIndex]=ev;this.callback(this.manager,eventType,{pointers:store,changedPointers:[ev],pointerType:pointerType,srcEvent:ev});if(removePointer){store.splice(storeIndex,1)}}});var SINGLE_TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var SINGLE_TOUCH_TARGET_EVENTS="touchstart";var SINGLE_TOUCH_WINDOW_EVENTS="touchstart touchmove touchend touchcancel";function SingleTouchInput(){this.evTarget=SINGLE_TOUCH_TARGET_EVENTS;this.evWin=SINGLE_TOUCH_WINDOW_EVENTS;this.started=false;Input.apply(this,arguments)}inherit(SingleTouchInput,Input,{handler:function TEhandler(ev){var type=SINGLE_TOUCH_INPUT_MAP[ev.type];if(type===INPUT_START){this.started=true}if(!this.started){return}var touches=normalizeSingleTouches.call(this,ev,type);if(type&(INPUT_END|INPUT_CANCEL)&&touches[0].length-touches[1].length===0){this.started=false}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function normalizeSingleTouches(ev,type){var all=toArray(ev.touches);var changed=toArray(ev.changedTouches);if(type&(INPUT_END|INPUT_CANCEL)){all=uniqueArray(all.concat(changed),"identifier",true)}return[all,changed]}var TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var TOUCH_TARGET_EVENTS="touchstart touchmove touchend touchcancel";function TouchInput(){this.evTarget=TOUCH_TARGET_EVENTS;this.targetIds={};Input.apply(this,arguments)}inherit(TouchInput,Input,{handler:function MTEhandler(ev){var type=TOUCH_INPUT_MAP[ev.type];var touches=getTouches.call(this,ev,type);if(!touches){return}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function getTouches(ev,type){var allTouches=toArray(ev.touches);var targetIds=this.targetIds;if(type&(INPUT_START|INPUT_MOVE)&&allTouches.length===1){targetIds[allTouches[0].identifier]=true;return[allTouches,allTouches]}var i,targetTouches,changedTouches=toArray(ev.changedTouches),changedTargetTouches=[],target=this.target;targetTouches=allTouches.filter(function(touch){return hasParent(touch.target,target)});if(type===INPUT_START){i=0;while(i<targetTouches.length){targetIds[targetTouches[i].identifier]=true;i++}}i=0;while(i<changedTouches.length){if(targetIds[changedTouches[i].identifier]){changedTargetTouches.push(changedTouches[i])}if(type&(INPUT_END|INPUT_CANCEL)){delete targetIds[changedTouches[i].identifier]}i++}if(!changedTargetTouches.length){return}return[uniqueArray(targetTouches.concat(changedTargetTouches),"identifier",true),changedTargetTouches]}function TouchMouseInput(){Input.apply(this,arguments);var handler=bindFn(this.handler,this);this.touch=new TouchInput(this.manager,handler);this.mouse=new MouseInput(this.manager,handler)}inherit(TouchMouseInput,Input,{handler:function TMEhandler(manager,inputEvent,inputData){var isTouch=inputData.pointerType==INPUT_TYPE_TOUCH,isMouse=inputData.pointerType==INPUT_TYPE_MOUSE;if(isTouch){this.mouse.allow=false}else if(isMouse&&!this.mouse.allow){return}if(inputEvent&(INPUT_END|INPUT_CANCEL)){this.mouse.allow=true}this.callback(manager,inputEvent,inputData)},destroy:function destroy(){this.touch.destroy();this.mouse.destroy()}});var PREFIXED_TOUCH_ACTION=prefixed(TEST_ELEMENT.style,"touchAction");var NATIVE_TOUCH_ACTION=PREFIXED_TOUCH_ACTION!==undefined;var TOUCH_ACTION_COMPUTE="compute";var TOUCH_ACTION_AUTO="auto";var TOUCH_ACTION_MANIPULATION="manipulation";var TOUCH_ACTION_NONE="none";var TOUCH_ACTION_PAN_X="pan-x";var TOUCH_ACTION_PAN_Y="pan-y";function TouchAction(manager,value){this.manager=manager;this.set(value)}TouchAction.prototype={set:function(value){if(value==TOUCH_ACTION_COMPUTE){value=this.compute()}if(NATIVE_TOUCH_ACTION){this.manager.element.style[PREFIXED_TOUCH_ACTION]=value}this.actions=value.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var actions=[];each(this.manager.recognizers,function(recognizer){if(boolOrFn(recognizer.options.enable,[recognizer])){actions=actions.concat(recognizer.getTouchAction())}});return cleanTouchActions(actions.join(" "))},preventDefaults:function(input){if(NATIVE_TOUCH_ACTION){return}var srcEvent=input.srcEvent;var direction=input.offsetDirection;if(this.manager.session.prevented){srcEvent.preventDefault();return}var actions=this.actions;var hasNone=inStr(actions,TOUCH_ACTION_NONE);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);if(hasNone||hasPanY&&direction&DIRECTION_HORIZONTAL||hasPanX&&direction&DIRECTION_VERTICAL){return this.preventSrc(srcEvent)}},preventSrc:function(srcEvent){this.manager.session.prevented=true;srcEvent.preventDefault()}};function cleanTouchActions(actions){if(inStr(actions,TOUCH_ACTION_NONE)){return TOUCH_ACTION_NONE}var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);if(hasPanX&&hasPanY){return TOUCH_ACTION_PAN_X+" "+TOUCH_ACTION_PAN_Y}if(hasPanX||hasPanY){return hasPanX?TOUCH_ACTION_PAN_X:TOUCH_ACTION_PAN_Y}if(inStr(actions,TOUCH_ACTION_MANIPULATION)){return TOUCH_ACTION_MANIPULATION}return TOUCH_ACTION_AUTO}var STATE_POSSIBLE=1;var STATE_BEGAN=2;var STATE_CHANGED=4;var STATE_ENDED=8;var STATE_RECOGNIZED=STATE_ENDED;var STATE_CANCELLED=16;var STATE_FAILED=32;function Recognizer(options){this.id=uniqueId();this.manager=null;this.options=merge(options||{},this.defaults);this.options.enable=ifUndefined(this.options.enable,true);this.state=STATE_POSSIBLE;this.simultaneous={};this.requireFail=[]}Recognizer.prototype={defaults:{},set:function(options){extend(this.options,options);this.manager&&this.manager.touchAction.update();return this},recognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"recognizeWith",this)){return this}var simultaneous=this.simultaneous;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(!simultaneous[otherRecognizer.id]){simultaneous[otherRecognizer.id]=otherRecognizer;otherRecognizer.recognizeWith(this)}return this},dropRecognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRecognizeWith",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);delete this.simultaneous[otherRecognizer.id];return this},requireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"requireFailure",this)){return this}var requireFail=this.requireFail;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(inArray(requireFail,otherRecognizer)===-1){requireFail.push(otherRecognizer);otherRecognizer.requireFailure(this)}return this},dropRequireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,"dropRequireFailure",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);var index=inArray(this.requireFail,otherRecognizer);if(index>-1){this.requireFail.splice(index,1)}return this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(otherRecognizer){return!!this.simultaneous[otherRecognizer.id]},emit:function(input){var self=this;var state=this.state;function emit(withState){self.manager.emit(self.options.event+(withState?stateStr(state):""),input)}if(state<STATE_ENDED){emit(true)}emit();if(state>=STATE_ENDED){emit(true)}},tryEmit:function(input){if(this.canEmit()){return this.emit(input)}this.state=STATE_FAILED},canEmit:function(){var i=0;while(i<this.requireFail.length){if(!(this.requireFail[i].state&(STATE_FAILED|STATE_POSSIBLE))){return false}i++}return true},recognize:function(inputData){var inputDataClone=extend({},inputData);if(!boolOrFn(this.options.enable,[this,inputDataClone])){this.reset();this.state=STATE_FAILED;return}if(this.state&(STATE_RECOGNIZED|STATE_CANCELLED|STATE_FAILED)){this.state=STATE_POSSIBLE}this.state=this.process(inputDataClone);if(this.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED|STATE_CANCELLED)){this.tryEmit(inputDataClone)}},process:function(inputData){},getTouchAction:function(){},reset:function(){}};function stateStr(state){if(state&STATE_CANCELLED){return"cancel"}else if(state&STATE_ENDED){return"end"}else if(state&STATE_CHANGED){return"move"}else if(state&STATE_BEGAN){return"start"}return""}function directionStr(direction){if(direction==DIRECTION_DOWN){return"down"}else if(direction==DIRECTION_UP){return"up"}else if(direction==DIRECTION_LEFT){return"left"}else if(direction==DIRECTION_RIGHT){return"right"}return""}function getRecognizerByNameIfManager(otherRecognizer,recognizer){var manager=recognizer.manager;if(manager){return manager.get(otherRecognizer)}return otherRecognizer}function AttrRecognizer(){Recognizer.apply(this,arguments)}inherit(AttrRecognizer,Recognizer,{defaults:{pointers:1},attrTest:function(input){var optionPointers=this.options.pointers;return optionPointers===0||input.pointers.length===optionPointers},process:function(input){var state=this.state;var eventType=input.eventType;var isRecognized=state&(STATE_BEGAN|STATE_CHANGED);var isValid=this.attrTest(input);if(isRecognized&&(eventType&INPUT_CANCEL||!isValid)){return state|STATE_CANCELLED}else if(isRecognized||isValid){if(eventType&INPUT_END){return state|STATE_ENDED}else if(!(state&STATE_BEGAN)){return STATE_BEGAN}return state|STATE_CHANGED}return STATE_FAILED}});function PanRecognizer(){AttrRecognizer.apply(this,arguments);this.pX=null;this.pY=null}inherit(PanRecognizer,AttrRecognizer,{defaults:{event:"pan",threshold:10,pointers:1,direction:DIRECTION_ALL},getTouchAction:function(){var direction=this.options.direction;var actions=[];if(direction&DIRECTION_HORIZONTAL){actions.push(TOUCH_ACTION_PAN_Y)}if(direction&DIRECTION_VERTICAL){actions.push(TOUCH_ACTION_PAN_X)}return actions},directionTest:function(input){var options=this.options;var hasMoved=true;var distance=input.distance;var direction=input.direction;var x=input.deltaX;var y=input.deltaY;if(!(direction&options.direction)){if(options.direction&DIRECTION_HORIZONTAL){direction=x===0?DIRECTION_NONE:x<0?DIRECTION_LEFT:DIRECTION_RIGHT;hasMoved=x!=this.pX;distance=Math.abs(input.deltaX)}else{direction=y===0?DIRECTION_NONE:y<0?DIRECTION_UP:DIRECTION_DOWN;hasMoved=y!=this.pY;distance=Math.abs(input.deltaY)}}input.direction=direction;return hasMoved&&distance>options.threshold&&direction&options.direction},attrTest:function(input){return AttrRecognizer.prototype.attrTest.call(this,input)&&(this.state&STATE_BEGAN||!(this.state&STATE_BEGAN)&&this.directionTest(input))},emit:function(input){this.pX=input.deltaX;this.pY=input.deltaY;var direction=directionStr(input.direction);if(direction){this.manager.emit(this.options.event+direction,input)}this._super.emit.call(this,input)}});function PinchRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.scale-1)>this.options.threshold||this.state&STATE_BEGAN)},emit:function(input){this._super.emit.call(this,input);if(input.scale!==1){var inOut=input.scale<1?"in":"out";this.manager.emit(this.options.event+inOut,input)}}});function PressRecognizer(){Recognizer.apply(this,arguments);this._timer=null;this._input=null}inherit(PressRecognizer,Recognizer,{defaults:{event:"press",pointers:1,time:500,threshold:5},getTouchAction:function(){return[TOUCH_ACTION_AUTO]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTime=input.deltaTime>options.time;this._input=input;if(!validMovement||!validPointers||input.eventType&(INPUT_END|INPUT_CANCEL)&&!validTime){this.reset()}else if(input.eventType&INPUT_START){this.reset();this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.time,this)}else if(input.eventType&INPUT_END){return STATE_RECOGNIZED}return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(input){if(this.state!==STATE_RECOGNIZED){return}if(input&&input.eventType&INPUT_END){this.manager.emit(this.options.event+"up",input)}else{this._input.timeStamp=now();this.manager.emit(this.options.event,this._input)}}});function RotateRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.rotation)>this.options.threshold||this.state&STATE_BEGAN)}});function SwipeRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:"swipe",threshold:10,velocity:.65,direction:DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this) | |
},attrTest:function(input){var direction=this.options.direction;var velocity;if(direction&(DIRECTION_HORIZONTAL|DIRECTION_VERTICAL)){velocity=input.velocity}else if(direction&DIRECTION_HORIZONTAL){velocity=input.velocityX}else if(direction&DIRECTION_VERTICAL){velocity=input.velocityY}return this._super.attrTest.call(this,input)&&direction&input.direction&&input.distance>this.options.threshold&&abs(velocity)>this.options.velocity&&input.eventType&INPUT_END},emit:function(input){var direction=directionStr(input.direction);if(direction){this.manager.emit(this.options.event+direction,input)}this.manager.emit(this.options.event,input)}});function TapRecognizer(){Recognizer.apply(this,arguments);this.pTime=false;this.pCenter=false;this._timer=null;this._input=null;this.count=0}inherit(TapRecognizer,Recognizer,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:2,posThreshold:10},getTouchAction:function(){return[TOUCH_ACTION_MANIPULATION]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTouchTime=input.deltaTime<options.time;this.reset();if(input.eventType&INPUT_START&&this.count===0){return this.failTimeout()}if(validMovement&&validTouchTime&&validPointers){if(input.eventType!=INPUT_END){return this.failTimeout()}var validInterval=this.pTime?input.timeStamp-this.pTime<options.interval:true;var validMultiTap=!this.pCenter||getDistance(this.pCenter,input.center)<options.posThreshold;this.pTime=input.timeStamp;this.pCenter=input.center;if(!validMultiTap||!validInterval){this.count=1}else{this.count+=1}this._input=input;var tapCount=this.count%options.taps;if(tapCount===0){if(!this.hasRequireFailures()){return STATE_RECOGNIZED}else{this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.interval,this);return STATE_BEGAN}}}return STATE_FAILED},failTimeout:function(){this._timer=setTimeoutContext(function(){this.state=STATE_FAILED},this.options.interval,this);return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(){if(this.state==STATE_RECOGNIZED){this._input.tapCount=this.count;this.manager.emit(this.options.event,this._input)}}});function Hammer(element,options){options=options||{};options.recognizers=ifUndefined(options.recognizers,Hammer.defaults.preset);return new Manager(element,options)}Hammer.VERSION="2.0.4";Hammer.defaults={domEvents:false,touchAction:TOUCH_ACTION_COMPUTE,enable:true,inputTarget:null,inputClass:null,preset:[[RotateRecognizer,{enable:false}],[PinchRecognizer,{enable:false},["rotate"]],[SwipeRecognizer,{direction:DIRECTION_HORIZONTAL}],[PanRecognizer,{direction:DIRECTION_HORIZONTAL},["swipe"]],[TapRecognizer],[TapRecognizer,{event:"doubletap",taps:2},["tap"]],[PressRecognizer]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};var STOP=1;var FORCED_STOP=2;function Manager(element,options){options=options||{};this.options=merge(options,Hammer.defaults);this.options.inputTarget=this.options.inputTarget||element;this.handlers={};this.session={};this.recognizers=[];this.element=element;this.input=createInputInstance(this);this.touchAction=new TouchAction(this,this.options.touchAction);toggleCssProps(this,true);each(options.recognizers,function(item){var recognizer=this.add(new item[0](item[1]));item[2]&&recognizer.recognizeWith(item[2]);item[3]&&recognizer.requireFailure(item[3])},this)}Manager.prototype={set:function(options){extend(this.options,options);if(options.touchAction){this.touchAction.update()}if(options.inputTarget){this.input.destroy();this.input.target=options.inputTarget;this.input.init()}return this},stop:function(force){this.session.stopped=force?FORCED_STOP:STOP},recognize:function(inputData){var session=this.session;if(session.stopped){return}this.touchAction.preventDefaults(inputData);var recognizer;var recognizers=this.recognizers;var curRecognizer=session.curRecognizer;if(!curRecognizer||curRecognizer&&curRecognizer.state&STATE_RECOGNIZED){curRecognizer=session.curRecognizer=null}var i=0;while(i<recognizers.length){recognizer=recognizers[i];if(session.stopped!==FORCED_STOP&&(!curRecognizer||recognizer==curRecognizer||recognizer.canRecognizeWith(curRecognizer))){recognizer.recognize(inputData)}else{recognizer.reset()}if(!curRecognizer&&recognizer.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED)){curRecognizer=session.curRecognizer=recognizer}i++}},get:function(recognizer){if(recognizer instanceof Recognizer){return recognizer}var recognizers=this.recognizers;for(var i=0;i<recognizers.length;i++){if(recognizers[i].options.event==recognizer){return recognizers[i]}}return null},add:function(recognizer){if(invokeArrayArg(recognizer,"add",this)){return this}var existing=this.get(recognizer.options.event);if(existing){this.remove(existing)}this.recognizers.push(recognizer);recognizer.manager=this;this.touchAction.update();return recognizer},remove:function(recognizer){if(invokeArrayArg(recognizer,"remove",this)){return this}var recognizers=this.recognizers;recognizer=this.get(recognizer);recognizers.splice(inArray(recognizers,recognizer),1);this.touchAction.update();return this},on:function(events,handler){var handlers=this.handlers;each(splitStr(events),function(event){handlers[event]=handlers[event]||[];handlers[event].push(handler)});return this},off:function(events,handler){var handlers=this.handlers;each(splitStr(events),function(event){if(!handler){delete handlers[event]}else{handlers[event].splice(inArray(handlers[event],handler),1)}});return this},emit:function(event,data){if(this.options.domEvents){triggerDomEvent(event,data)}var handlers=this.handlers[event]&&this.handlers[event].slice();if(!handlers||!handlers.length){return}data.type=event;data.preventDefault=function(){data.srcEvent.preventDefault()};var i=0;while(i<handlers.length){handlers[i](data);i++}},destroy:function(){this.element&&toggleCssProps(this,false);this.handlers={};this.session={};this.input.destroy();this.element=null}};function toggleCssProps(manager,add){var element=manager.element;each(manager.options.cssProps,function(value,name){element.style[prefixed(element.style,name)]=add?value:""})}function triggerDomEvent(event,data){var gestureEvent=document.createEvent("Event");gestureEvent.initEvent(event,true,true);gestureEvent.gesture=data;data.target.dispatchEvent(gestureEvent)}extend(Hammer,{INPUT_START:INPUT_START,INPUT_MOVE:INPUT_MOVE,INPUT_END:INPUT_END,INPUT_CANCEL:INPUT_CANCEL,STATE_POSSIBLE:STATE_POSSIBLE,STATE_BEGAN:STATE_BEGAN,STATE_CHANGED:STATE_CHANGED,STATE_ENDED:STATE_ENDED,STATE_RECOGNIZED:STATE_RECOGNIZED,STATE_CANCELLED:STATE_CANCELLED,STATE_FAILED:STATE_FAILED,DIRECTION_NONE:DIRECTION_NONE,DIRECTION_LEFT:DIRECTION_LEFT,DIRECTION_RIGHT:DIRECTION_RIGHT,DIRECTION_UP:DIRECTION_UP,DIRECTION_DOWN:DIRECTION_DOWN,DIRECTION_HORIZONTAL:DIRECTION_HORIZONTAL,DIRECTION_VERTICAL:DIRECTION_VERTICAL,DIRECTION_ALL:DIRECTION_ALL,Manager:Manager,Input:Input,TouchAction:TouchAction,TouchInput:TouchInput,MouseInput:MouseInput,PointerEventInput:PointerEventInput,TouchMouseInput:TouchMouseInput,SingleTouchInput:SingleTouchInput,Recognizer:Recognizer,AttrRecognizer:AttrRecognizer,Tap:TapRecognizer,Pan:PanRecognizer,Swipe:SwipeRecognizer,Pinch:PinchRecognizer,Rotate:RotateRecognizer,Press:PressRecognizer,on:addEventListeners,off:removeEventListeners,each:each,merge:merge,extend:extend,inherit:inherit,bindFn:bindFn,prefixed:prefixed});if(typeof define==TYPE_FUNCTION&&define.amd){define(function(){return Hammer})}else if(typeof module!="undefined"&&module.exports){module.exports=Hammer}else{window[exportName]=Hammer}})(window,document,"Hammer")},{}],4:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents=Object.create(null);return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}var handlers=registeredEvents[eventName];if(!handlers){handlers=registeredEvents[eventName]=[]}handlers.push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents=Object.create(null);return subject}if(registeredEvents[eventName]){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var callbacks=registeredEvents[eventName];if(!callbacks){return subject}var fireArguments;if(arguments.length>1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],5:[function(require,module,exports){module.exports=createLayout;var MAX_MOVEMENT=.001;function createLayout(graph,physicsSimulator){if(!graph){throw new Error("Graph structure cannot be undefined")}var simulator=require("ngraph.physics.simulator"),physics=require("ngraph.physics.primitives");physicsSimulator=physicsSimulator||simulator();var nodeBodies=typeof Object.create==="function"?Object.create(null):{},springs={};initPhysics();listenToGraphEvents();return{step:function(){var totalMovement=physicsSimulator.step();return totalMovement<MAX_MOVEMENT},getNodePosition:function(nodeId){return getInitializedBody(nodeId).pos},setNodePosition:function(nodeId,x,y){var body=getInitializedBody(nodeId);body.prevPos.x=body.pos.x=x;body.prevPos.y=body.pos.y=y},getLinkPosition:function(linkId){var spring=springs[linkId];if(spring){return{from:spring.from.pos,to:spring.to.pos}}},getGraphRect:function(){return physicsSimulator.getBBox()},pinNode:function(node,isPinned){var body=getInitializedBody(node.id);body.isPinned=!!isPinned},isNodePinned:function(node){return getInitializedBody(node.id).isPinned},dispose:function(){graph.off("changed",onGraphChanged)},simulator:physicsSimulator};function listenToGraphEvents(){graph.on("changed",onGraphChanged)}function onGraphChanged(changes){for(var i=0;i<changes.length;++i){var change=changes[i];if(change.changeType==="add"){if(change.node){initBody(change.node.id)}if(change.link){initLink(change.link)}}else if(change.changeType==="remove"){if(change.node){releaseNode(change.node)}if(change.link){releaseLink(change.link)}}}}function initPhysics(){graph.forEachNode(function(node){initBody(node.id)});graph.forEachLink(initLink)}function initBody(nodeId){var body=nodeBodies[nodeId];if(!body){var node=graph.getNode(nodeId);if(!node){throw new Error("initBody() was called with unknown node id")}var pos=node.position;if(!pos){var neighbors=getNeighborBodies(node);pos=physicsSimulator.getBestNewBodyPosition(neighbors)}body=physicsSimulator.addBodyAt(pos);nodeBodies[nodeId]=body;updateBodyMass(nodeId);if(isNodeOriginallyPinned(node)){body.isPinned=true}}}function releaseNode(node){var nodeId=node.id;var body=nodeBodies[nodeId];if(body){nodeBodies[nodeId]=null;delete nodeBodies[nodeId];physicsSimulator.removeBody(body)}}function initLink(link){updateBodyMass(link.fromId);updateBodyMass(link.toId);var fromBody=nodeBodies[link.fromId],toBody=nodeBodies[link.toId],spring=physicsSimulator.addSpring(fromBody,toBody,link.length);springs[link.id]=spring}function releaseLink(link){var spring=springs[link.id];if(spring){var from=graph.getNode(link.fromId),to=graph.getNode(link.toId);if(from)updateBodyMass(from.id);if(to)updateBodyMass(to.id);delete springs[link.id];physicsSimulator.removeSpring(spring)}}function getNeighborBodies(node){var neighbors=[];if(!node.links){return neighbors}var maxNeighbors=Math.min(node.links.length,2);for(var i=0;i<maxNeighbors;++i){var link=node.links[i];var otherBody=link.fromId!==node.id?nodeBodies[link.fromId]:nodeBodies[link.toId];if(otherBody&&otherBody.pos){neighbors.push(otherBody)}}return neighbors}function updateBodyMass(nodeId){var body=nodeBodies[nodeId];body.mass=nodeMass(nodeId)}function isNodeOriginallyPinned(node){return node&&(node.isPinned||node.data&&node.data.isPinned)}function getInitializedBody(nodeId){var body=nodeBodies[nodeId];if(!body){initBody(nodeId);body=nodeBodies[nodeId]}return body}function nodeMass(nodeId){return 1+graph.getLinks(nodeId).length/3}}},{"ngraph.physics.primitives":6,"ngraph.physics.simulator":8}],6:[function(require,module,exports){module.exports={Body:Body,Vector2d:Vector2d,Body3d:Body3d,Vector3d:Vector3d};function Body(x,y){this.pos=new Vector2d(x,y);this.prevPos=new Vector2d(x,y);this.force=new Vector2d;this.velocity=new Vector2d;this.mass=1}Body.prototype.setPosition=function(x,y){this.prevPos.x=this.pos.x=x;this.prevPos.y=this.pos.y=y};function Vector2d(x,y){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0}}Vector2d.prototype.reset=function(){this.x=this.y=0};function Body3d(x,y,z){this.pos=new Vector3d(x,y,z);this.prevPos=new Vector3d(x,y,z);this.force=new Vector3d;this.velocity=new Vector3d;this.mass=1}Body3d.prototype.setPosition=function(x,y,z){this.prevPos.x=this.pos.x=x;this.prevPos.y=this.pos.y=y;this.prevPos.z=this.pos.z=z};function Vector3d(x,y,z){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0;this.z=typeof x.z==="number"?x.z:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0;this.z=typeof z==="number"?z:0}}Vector3d.prototype.reset=function(){this.x=this.y=this.z=0}},{}],7:[function(require,module,exports){module.exports=merge;function merge(target,options){var key;if(!target){target={}}if(options){for(key in options){if(options.hasOwnProperty(key)){var targetHasIt=target.hasOwnProperty(key),optionsValueType=typeof options[key],shouldReplace=!targetHasIt||typeof target[key]!==optionsValueType;if(shouldReplace){target[key]=options[key]}else if(optionsValueType==="object"){target[key]=merge(target[key],options[key])}}}}return target}},{}],8:[function(require,module,exports){module.exports=physicsSimulator;function physicsSimulator(settings){var Spring=require("./lib/spring");var expose=require("ngraph.expose");var merge=require("ngraph.merge");settings=merge(settings,{springLength:30,springCoeff:8e-4,gravity:-1.2,theta:.8,dragCoeff:.02,timeStep:20});var createQuadTree=settings.createQuadTree||require("ngraph.quadtreebh");var createBounds=settings.createBounds||require("./lib/bounds");var createDragForce=settings.createDragForce||require("./lib/dragForce");var createSpringForce=settings.createSpringForce||require("./lib/springForce");var integrate=settings.integrator||require("./lib/eulerIntegrator");var createBody=settings.createBody||require("./lib/createBody");var bodies=[],springs=[],quadTree=createQuadTree(settings),bounds=createBounds(bodies,settings),springForce=createSpringForce(settings),dragForce=createDragForce(settings);var publicApi={bodies:bodies,step:function(){accumulateForces();var totalMovement=integrate(bodies,settings.timeStep);bounds.update();return totalMovement},addBody:function(body){if(!body){throw new Error("Body is required")}bodies.push(body);return body},addBodyAt:function(pos){if(!pos){throw new Error("Body position is required")}var body=createBody(pos);bodies.push(body);return body},removeBody:function(body){if(!body){return}var idx=bodies.indexOf(body);if(idx<0){return}bodies.splice(idx,1);if(bodies.length===0){bounds.reset()}return true},addSpring:function(body1,body2,springLength,springWeight,springCoefficient){if(!body1||!body2){throw new Error("Cannot add null spring to force simulator")}if(typeof springLength!=="number"){springLength=-1}var spring=new Spring(body1,body2,springLength,springCoefficient>=0?springCoefficient:-1,springWeight);springs.push(spring);return spring},removeSpring:function(spring){if(!spring){return}var idx=springs.indexOf(spring);if(idx>-1){springs.splice(idx,1);return true}},getBestNewBodyPosition:function(neighbors){return bounds.getBestNewPosition(neighbors)},getBBox:function(){return bounds.box},gravity:function(value){if(value!==undefined){settings.gravity=value;quadTree.options({gravity:value});return this}else{return settings.gravity}},theta:function(value){if(value!==undefined){settings.theta=value;quadTree.options({theta:value});return this}else{return settings.theta}}};expose(settings,publicApi);return publicApi;function accumulateForces(){var body,i=bodies.length;if(i){quadTree.insertBodies(bodies);while(i--){body=bodies[i];body.force.reset();quadTree.updateBodyForce(body);dragForce.update(body)}}i=springs.length;while(i--){springForce.update(springs[i])}}}},{"./lib/bounds":9,"./lib/createBody":10,"./lib/dragForce":11,"./lib/eulerIntegrator":12,"./lib/spring":13,"./lib/springForce":14,"ngraph.expose":15,"ngraph.merge":7,"ngraph.quadtreebh":17}],9:[function(require,module,exports){module.exports=function(bodies,settings){var random=require("ngraph.random").random(42);var boundingBox={x1:0,y1:0,x2:0,y2:0};return{box:boundingBox,update:updateBoundingBox,reset:function(){boundingBox.x1=boundingBox.y1=0;boundingBox.x2=boundingBox.y2=0},getBestNewPosition:function(neighbors){var graphRect=boundingBox;var baseX=0,baseY=0;if(neighbors.length){for(var i=0;i<neighbors.length;++i){baseX+=neighbors[i].pos.x;baseY+=neighbors[i].pos.y}baseX/=neighbors.length;baseY/=neighbors.length}else{baseX=(graphRect.x1+graphRect.x2)/2;baseY=(graphRect.y1+graphRect.y2)/2}var springLength=settings.springLength;return{x:baseX+random.next(springLength)-springLength/2,y:baseY+random.next(springLength)-springLength/2}}};function updateBoundingBox(){var i=bodies.length;if(i===0){return}var x1=Number.MAX_VALUE,y1=Number.MAX_VALUE,x2=Number.MIN_VALUE,y2=Number.MIN_VALUE;while(i--){var body=bodies[i];if(body.isPinned){body.pos.x=body.prevPos.x;body.pos.y=body.prevPos.y}else{body.prevPos.x=body.pos.x;body.prevPos.y=body.pos.y}if(body.pos.x<x1){x1=body.pos.x}if(body.pos.x>x2){x2=body.pos.x}if(body.pos.y<y1){y1=body.pos.y}if(body.pos.y>y2){y2=body.pos.y}}boundingBox.x1=x1;boundingBox.x2=x2;boundingBox.y1=y1;boundingBox.y2=y2}}},{"ngraph.random":21}],10:[function(require,module,exports){var physics=require("ngraph.physics.primitives");module.exports=function(pos){return new physics.Body(pos)}},{"ngraph.physics.primitives":16}],11:[function(require,module,exports){module.exports=function(options){var merge=require("ngraph.merge"),expose=require("ngraph.expose");options=merge(options,{dragCoeff:.02});var api={update:function(body){body.force.x-=options.dragCoeff*body.velocity.x;body.force.y-=options.dragCoeff*body.velocity.y}};expose(options,api,["dragCoeff"]);return api}},{"ngraph.expose":15,"ngraph.merge":7}],12:[function(require,module,exports){module.exports=integrate;function integrate(bodies,timeStep){var dx=0,tx=0,dy=0,ty=0,i,max=bodies.length;for(i=0;i<max;++i){var body=bodies[i],coeff=timeStep/body.mass;body.velocity.x+=coeff*body.force.x;body.velocity.y+=coeff*body.force.y;var vx=body.velocity.x,vy=body.velocity.y,v=Math.sqrt(vx*vx+vy*vy);if(v>1){body.velocity.x=vx/v;body.velocity.y=vy/v}dx=timeStep*body.velocity.x;dy=timeStep*body.velocity.y;body.pos.x+=dx;body.pos.y+=dy;tx+=dx;ty+=dy}return(tx*tx+ty*ty)/bodies.length}},{}],13:[function(require,module,exports){module.exports=Spring;function Spring(fromBody,toBody,length,coeff,weight){this.from=fromBody;this.to=toBody;this.length=length;this.coeff=coeff;this.weight=typeof weight==="number"?weight:1}},{}],14:[function(require,module,exports){module.exports=function(options){var merge=require("ngraph.merge");var random=require("ngraph.random").random(42);var expose=require("ngraph.expose");options=merge(options,{springCoeff:2e-4,springLength:80});var api={update:function(spring){var body1=spring.from,body2=spring.to,length=spring.length<0?options.springLength:spring.length,dx=body2.pos.x-body1.pos.x,dy=body2.pos.y-body1.pos.y,r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}var d=r-length;var coeff=(!spring.coeff||spring.coeff<0?options.springCoeff:spring.coeff)*d/r*spring.weight;body1.force.x+=coeff*dx;body1.force.y+=coeff*dy;body2.force.x-=coeff*dx;body2.force.y-=coeff*dy}};expose(options,api,["springCoeff","springLength"]);return api}},{"ngraph.expose":15,"ngraph.merge":7,"ngraph.random":21}],15:[function(require,module,exports){module.exports=exposeProperties;function exposeProperties(settings,target,filter){var needsFilter=Object.prototype.toString.call(filter)==="[object Array]";if(needsFilter){for(var i=0;i<filter.length;++i){augment(settings,target,filter[i])}}else{for(var key in settings){augment(settings,target,key)}}}function augment(source,target,key){if(source.hasOwnProperty(key)){if(typeof target[key]==="function"){return}target[key]=function(value){if(value!==undefined){source[key]=value;return target}return source[key]}}}},{}],16:[function(require,module,exports){module.exports={Body:Body,Vector2d:Vector2d,Body3d:Body3d,Vector3d:Vector3d};function Body(x,y){this.pos=new Vector2d(x,y);this.prevPos=new Vector2d(x,y);this.force=new Vector2d;this.velocity=new Vector2d;this.mass=1}function Vector2d(x,y){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0}}Vector2d.prototype.reset=function(){this.x=this.y=0};function Body3d(x,y,z){this.pos=new Vector3d(x,y,z);this.prevPos=new Vector3d(x,y,z);this.force=new Vector3d;this.velocity=new Vector3d;this.mass=1}function Vector3d(x,y,z){if(x&&typeof x!=="number"){this.x=typeof x.x==="number"?x.x:0;this.y=typeof x.y==="number"?x.y:0;this.z=typeof x.z==="number"?x.z:0}else{this.x=typeof x==="number"?x:0;this.y=typeof y==="number"?y:0;this.z=typeof z==="number"?z:0}}Vector3d.prototype.reset=function(){this.x=this.y=this.z=0}},{}],17:[function(require,module,exports){module.exports=function(options){options=options||{};options.gravity=typeof options.gravity==="number"?options.gravity:-1;options.theta=typeof options.theta==="number"?options.theta:.8;var random=require("ngraph.random").random(1984),Node=require("./node"),InsertStack=require("./insertStack"),isSamePosition=require("./isSamePosition");var gravity=options.gravity,updateQueue=[],insertStack=new InsertStack,theta=options.theta,nodesCache=[],currentInCache=0,newNode=function(){var node=nodesCache[currentInCache];if(node){node.quads[0]=null;node.quads[1]=null;node.quads[2]=null;node.quads[3]=null;node.body=null;node.mass=node.massX=node.massY=0;node.left=node.right=node.top=node.bottom=0}else{node=new Node;nodesCache[currentInCache]=node}++currentInCache;return node},root=newNode(),insert=function(newBody){insertStack.reset();insertStack.push(root,newBody);while(!insertStack.isEmpty()){var stackItem=insertStack.pop(),node=stackItem.node,body=stackItem.body;if(!node.body){var x=body.pos.x;var y=body.pos.y;node.mass=node.mass+body.mass;node.massX=node.massX+body.mass*x;node.massY=node.massY+body.mass*y;var quadIdx=0,left=node.left,right=(node.right+left)/2,top=node.top,bottom=(node.bottom+top)/2;if(x>right){quadIdx=quadIdx+1;var oldLeft=left;left=right;right=right+(right-oldLeft)}if(y>bottom){quadIdx=quadIdx+2;var oldTop=top;top=bottom;bottom=bottom+(bottom-oldTop)}var child=node.quads[quadIdx];if(!child){child=newNode();child.left=left;child.top=top;child.right=right;child.bottom=bottom;child.body=body;node.quads[quadIdx]=child}else{insertStack.push(child,body)}}else{var oldBody=node.body;node.body=null;if(isSamePosition(oldBody.pos,body.pos)){if(node.right-node.left<1e-8){return}do{var offset=random.nextDouble();var dx=(node.right-node.left)*offset;var dy=(node.bottom-node.top)*offset;oldBody.pos.x=node.left+dx;oldBody.pos.y=node.top+dy}while(isSamePosition(oldBody.pos,body.pos))}insertStack.push(node,oldBody);insertStack.push(node,body)}}},update=function(sourceBody){var queue=updateQueue,v,dx,dy,r,queueLength=1,shiftIdx=0,pushIdx=1;queue[0]=root;while(queueLength){var node=queue[shiftIdx],body=node.body;queueLength-=1;shiftIdx+=1;if(body&&body!==sourceBody){dx=body.pos.x-sourceBody.pos.x;dy=body.pos.y-sourceBody.pos.y;r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}v=gravity*body.mass*sourceBody.mass/(r*r*r);sourceBody.force.x+=v*dx;sourceBody.force.y+=v*dy}else{dx=node.massX/node.mass-sourceBody.pos.x;dy=node.massY/node.mass-sourceBody.pos.y;r=Math.sqrt(dx*dx+dy*dy);if(r===0){dx=(random.nextDouble()-.5)/50;dy=(random.nextDouble()-.5)/50;r=Math.sqrt(dx*dx+dy*dy)}if((node.right-node.left)/r<theta){v=gravity*node.mass*sourceBody.mass/(r*r*r);sourceBody.force.x+=v*dx;sourceBody.force.y+=v*dy}else{if(node.quads[0]){queue[pushIdx]=node.quads[0];queueLength+=1;pushIdx+=1}if(node.quads[1]){queue[pushIdx]=node.quads[1];queueLength+=1;pushIdx+=1}if(node.quads[2]){queue[pushIdx]=node.quads[2];queueLength+=1;pushIdx+=1}if(node.quads[3]){queue[pushIdx]=node.quads[3];queueLength+=1;pushIdx+=1}}}}},insertBodies=function(bodies){var x1=Number.MAX_VALUE,y1=Number.MAX_VALUE,x2=Number.MIN_VALUE,y2=Number.MIN_VALUE,i,max=bodies.length;i=max;while(i--){var x=bodies[i].pos.x;var y=bodies[i].pos.y;if(x<x1){x1=x}if(x>x2){x2=x}if(y<y1){y1=y}if(y>y2){y2=y}}var dx=x2-x1,dy=y2-y1;if(dx>dy){y2=y1+dx}else{x2=x1+dy}currentInCache=0;root=newNode();root.left=x1;root.right=x2;root.top=y1;root.bottom=y2;i=max-1;if(i>0){root.body=bodies[i]}while(i--){insert(bodies[i],root)}};return{insertBodies:insertBodies,updateBodyForce:update,options:function(newOptions){if(newOptions){if(typeof newOptions.gravity==="number"){gravity=newOptions.gravity}if(typeof newOptions.theta==="number"){theta=newOptions.theta}return this}return{gravity:gravity,theta:theta}}}}},{"./insertStack":18,"./isSamePosition":19,"./node":20,"ngraph.random":21}],18:[function(require,module,exports){module.exports=InsertStack;function InsertStack(){this.stack=[];this.popIdx=0}InsertStack.prototype={isEmpty:function(){return this.popIdx===0},push:function(node,body){var item=this.stack[this.popIdx];if(!item){this.stack[this.popIdx]=new InsertStackElement(node,body)}else{item.node=node;item.body=body}++this.popIdx},pop:function(){if(this.popIdx>0){return this.stack[--this.popIdx]}},reset:function(){this.popIdx=0}};function InsertStackElement(node,body){this.node=node;this.body=body}},{}],19:[function(require,module,exports){module.exports=function isSamePosition(point1,point2){var dx=Math.abs(point1.x-point2.x);var dy=Math.abs(point1.y-point2.y);return dx<1e-8&&dy<1e-8}},{}],20:[function(require,module,exports){module.exports=function Node(){this.body=null;this.quads=[];this.mass=0;this.massX=0;this.massY=0;this.left=0;this.top=0;this.bottom=0;this.right=0;this.isInternal=false}},{}],21:[function(require,module,exports){module.exports={random:random,randomIterator:randomIterator};function random(inputSeed){var seed=typeof inputSeed==="number"?inputSeed:+new Date;var randomFunc=function(){seed=seed+2127912214+(seed<<12)&4294967295;seed=(seed^3345072700^seed>>>19)&4294967295;seed=seed+374761393+(seed<<5)&4294967295;seed=(seed+3550635116^seed<<9)&4294967295;seed=seed+4251993797+(seed<<3)&4294967295;seed=(seed^3042594569^seed>>>16)&4294967295;return(seed&268435455)/268435456};return{next:function(maxValue){return Math.floor(randomFunc()*maxValue)},nextDouble:function(){return randomFunc()}}}function randomIterator(array,customRandom){var localRandom=customRandom||random();if(typeof localRandom.next!=="function"){throw new Error("customRandom does not match expected API: next() function is missing")}return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t;callback(t)}if(array.length){callback(array[0])}},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t}return array}}}},{}],22:[function(require,module,exports){module.exports=svg;svg.compile=require("./lib/compile");var compileTemplate=svg.compileTemplate=require("./lib/compileTemplate");var domEvents=require("add-event-listener");var svgns="http://www.w3.org/2000/svg";var xlinkns="http://www.w3.org/1999/xlink";function svg(element){var svgElement=element;if(typeof element==="string"){svgElement=window.document.createElementNS(svgns,element)}else if(element.simplesvg){return element}var compiledTempalte;svgElement.simplesvg=true;svgElement.attr=attr;svgElement.append=append;svgElement.on=on;svgElement.off=off;svgElement.dataSource=dataSource;return svgElement;function dataSource(model){if(!compiledTempalte)compiledTempalte=compileTemplate(svgElement);compiledTempalte.link(model)}function on(name,cb,useCapture){domEvents.addEventListener(svgElement,name,cb,useCapture);return svgElement}function off(name,cb,useCapture){domEvents.removeEventListener(svgElement,name,cb,useCapture);return svgElement}function append(child){svgElement.appendChild(svg(child));return child}function attr(name,value){if(arguments.length===2){if(value!==null){svgElement.setAttributeNS(null,name,value)}else{svgElement.removeAttributeNS(null,name)}return svgElement}return svgElement.getAttributeNS(null,name)}}},{"./lib/compile":23,"./lib/compileTemplate":24,"add-event-listener":25}],23:[function(require,module,exports){var parser=new DOMParser;var svg=require("../");module.exports=compile;function compile(svgText){try{svgText=addNamespaces(svgText);return svg(parser.parseFromString(svgText,"text/xml").documentElement)}catch(e){throw e}}function addNamespaces(text){if(!text)return;var namespaces='xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"';var match=text.match(/^<\w+/);if(match){var tagLength=match[0].length;return text.substr(0,tagLength)+" "+namespaces+" "+text.substr(tagLength)}else{throw new Error("Cannot parse input text: invalid xml?")}}},{"../":22}],24:[function(require,module,exports){module.exports=template;var BINDING_EXPR=/{{(.+?)}}/;function template(domNode){var allBindings=Object.create(null);extractAllBindings(domNode,allBindings);return{link:function(model){Object.keys(allBindings).forEach(function(key){var setter=allBindings[key];setter(model)})}}}function extractAllBindings(domNode,allBindings){var nodeType=domNode.nodeType;var typeSupported=nodeType===1||nodeType===3;if(!typeSupported)return;var i;if(domNode.hasChildNodes()){var domChildren=domNode.childNodes;for(i=0;i<domChildren.length;++i){extractAllBindings(domChildren[i],allBindings)}}if(nodeType===3){bindTextContent(domNode,allBindings)}if(!domNode.attributes)return;var attrs=domNode.attributes;for(i=0;i<attrs.length;++i){bindDomAttribute(attrs[i],domNode,allBindings)}}function bindDomAttribute(domAttribute,element,allBindings){var value=domAttribute.value;if(!value)return;var modelNameMatch=value.match(BINDING_EXPR);if(!modelNameMatch)return;var attrName=domAttribute.localName;var modelPropertyName=modelNameMatch[1];var isSimpleValue=modelPropertyName.indexOf(".")<0;if(!isSimpleValue)throw new Error("simplesvg currently does not support nested bindings");allBindings[modelPropertyName]=attributeSetter;function attributeSetter(model){element.setAttributeNS(null,attrName,model[modelPropertyName])}}function bindTextContent(element,allBindings){var value=element.nodeValue; | |
if(!value)return;var modelNameMatch=value.match(BINDING_EXPR);if(!modelNameMatch)return;var modelPropertyName=modelNameMatch[1];var isSimpleValue=modelPropertyName.indexOf(".")<0;allBindings[modelPropertyName]=textSetter;function textSetter(model){element.nodeValue=model[modelPropertyName]}}},{}],25:[function(require,module,exports){addEventListener.removeEventListener=removeEventListener;addEventListener.addEventListener=addEventListener;module.exports=addEventListener;var Events=null;function addEventListener(el,eventName,listener,useCapture){Events=Events||(document.addEventListener?{add:stdAttach,rm:stdDetach}:{add:oldIEAttach,rm:oldIEDetach});return Events.add(el,eventName,listener,useCapture)}function removeEventListener(el,eventName,listener,useCapture){Events=Events||(document.addEventListener?{add:stdAttach,rm:stdDetach}:{add:oldIEAttach,rm:oldIEDetach});return Events.rm(el,eventName,listener,useCapture)}function stdAttach(el,eventName,listener,useCapture){el.addEventListener(eventName,listener,useCapture)}function stdDetach(el,eventName,listener,useCapture){el.removeEventListener(eventName,listener,useCapture)}function oldIEAttach(el,eventName,listener,useCapture){if(useCapture){throw new Error("cannot useCapture in oldIE")}el.attachEvent("on"+eventName,listener)}function oldIEDetach(el,eventName,listener,useCapture){el.detachEvent("on"+eventName,listener)}},{}],26:[function(require,module,exports){module.exports=addWheelListener;var prefix="",_addEventListener,onwheel,support;if(window.addEventListener){_addEventListener="addEventListener"}else{_addEventListener="attachEvent";prefix="on"}support="onwheel"in document.createElement("div")?"wheel":document.onmousewheel!==undefined?"mousewheel":"DOMMouseScroll";function addWheelListener(elem,callback,useCapture){_addWheelListener(elem,support,callback,useCapture);if(support=="DOMMouseScroll"){_addWheelListener(elem,"MozMousePixelScroll",callback,useCapture)}}function _addWheelListener(elem,eventName,callback,useCapture){elem[_addEventListener](prefix+eventName,support=="wheel"?callback:function(originalEvent){!originalEvent&&(originalEvent=window.event);var event={originalEvent:originalEvent,target:originalEvent.target||originalEvent.srcElement,type:"wheel",deltaMode:originalEvent.type=="MozMousePixelScroll"?0:1,deltaX:0,delatZ:0,preventDefault:function(){originalEvent.preventDefault?originalEvent.preventDefault():originalEvent.returnValue=false}};if(support=="mousewheel"){event.deltaY=-1/40*originalEvent.wheelDelta;originalEvent.wheelDeltaX&&(event.deltaX=-1/40*originalEvent.wheelDeltaX)}else{event.deltaY=originalEvent.detail}return callback(event)},useCapture||false)}},{}],"ngraph.svg":[function(require,module,exports){var svg=require("simplesvg");var hammer=require("hammerjs");var MOVE_EVENTS="panstart panmove panend";module.exports=ngraphSvg;function ngraphSvg(graph,settings){settings=settings||{};var layout=require("./lib/defaultLayout.js")(graph,settings);var container=settings.container||document.body;var isStable=false;var disposed=false;var sceneInitialized=false;var svgRoot=createSvgRoot(container);var sceneRoot=createSceneRoot(svgRoot);var sceneTransform=createSceneTransform(sceneRoot);var panSession={};var panNode=0;var linkLayer=addLayer("links",sceneRoot);var nodeLayer=addLayer("nodes",sceneRoot);var nodes=Object.create(null);var links=Object.create(null);var fromX=0,fromY=0;var screenPinchX,screenPinchY,lastScale;var cachedPos={x:0,y:0},cachedFromPos={x:0,y:0},cachedToPos={x:0,y:0};var defaultUI=require("./lib/defaultUI.js");var nodeBuilder=defaultUI.nodeBuilder,nodePositionCallback=defaultUI.nodePositionCallback,linkBuilder=defaultUI.linkBuilder,linkPositionCallback=defaultUI.linkPositionCallback;var currentTransform={tx:0,ty:0,scale:1};var api={run:animationLoop,renderOneFrame:renderOneFrame,layout:layout,dispose:dispose,node:setNodeBuilder,link:setLinkBuilder,placeNode:placeNode,placeLink:placeLink,svgRoot:svgRoot};require("ngraph.events")(api);return api;function dispose(){layout.dispose();api.off();disposed=true;listenToGraphEvents(false);releaseDOMEvents()}function placeLink(newPlaceLinkCallback){linkPositionCallback=newPlaceLinkCallback;return api}function placeNode(newPlaceCallback){nodePositionCallback=newPlaceCallback;return api}function animationLoop(){if(disposed)return;requestAnimationFrame(animationLoop);if(!isStable){isStable=layout.step();renderOneFrame()}}function renderOneFrame(){if(disposed)return;if(!sceneInitialized)initializeScene();for(var nodeId in nodes){var nodeInfo=nodes[nodeId];cachedPos.x=nodeInfo.pos.x;cachedPos.y=nodeInfo.pos.y;nodePositionCallback(nodeInfo.ui,cachedPos,nodeInfo.model)}for(var linkId in links){var linkInfo=links[linkId];cachedFromPos.x=linkInfo.pos.from.x;cachedFromPos.y=linkInfo.pos.from.y;cachedToPos.x=linkInfo.pos.to.x;cachedToPos.y=linkInfo.pos.to.y;linkPositionCallback(linkInfo.ui,cachedFromPos,cachedToPos,linkInfo.model)}}function initializeScene(){graph.forEachNode(addNode);graph.forEachLink(addLink);moveTo(container.clientWidth/2,container.clientHeight/2);listenToGraphEvents(true);sceneInitialized=true}function addLink(link){var linkUI=linkBuilder(link);if(!linkUI)throw new Error("Link builder is supposed to return SVG object");links[link.id]={pos:layout.getLinkPosition(link.id),model:link,ui:linkUI};linkLayer.append(linkUI)}function addNode(node){var ui=nodeBuilder(node);if(!ui)throw new Error("Node builder is supposed to return SVG object");nodeLayer.append(ui);var pos=layout.getNodePosition(node.id);var nodeDescriptor={pos:pos,model:node,ui:ui};var recognizers={recognizers:[[hammer.Pan,{threshold:1}]]};nodeDescriptor.events=hammer(ui,recognizers).on(MOVE_EVENTS,onNodePan(pos,node));nodes[node.id]=nodeDescriptor}function setLinkBuilder(builderCallback){if(typeof builderCallback!=="function")throw new Error("link builder callback is supposed to be a function");linkBuilder=builderCallback;return api}function setNodeBuilder(builderCallback){if(typeof builderCallback!=="function")throw new Error("node builder callback is supposed to be a function");nodeBuilder=builderCallback;return api}function listenToGraphEvents(isOn){graph[isOn?"on":"off"]("changed",onGraphChanged)}function onGraphChanged(changes){resetStable();for(var i=0;i<changes.length;++i){var change=changes[i];if(change.changeType==="add"){if(change.node){addNode(change.node)}if(change.link){addLink(change.link)}}else if(change.changeType==="remove"){if(change.node){removeNode(change.node)}if(change.link){removeLink(change.link)}}}}function resetStable(){isStable=false}function createSvgRoot(element){if(element instanceof SVGSVGElement)return element;var svgRoot=svg("svg");element.appendChild(svgRoot);return svgRoot}function createSceneRoot(svgRoot){var scene=svg("g").attr("buffered-rendering","dynamic");svgRoot.append(scene);var sceneMoveRecognizer={recognizers:[[hammer.Pan,{threshold:1}],[hammer.Pinch,{enable:true}]]};hammer(container,sceneMoveRecognizer).on(MOVE_EVENTS,onScenePan).on("pinchstart pinchin pinchout",onScreenPinch);var addWheelListener=require("wheel");addWheelListener(svgRoot,onWheel);return scene}function onScenePan(e){if(e.target!==svgRoot||panNode>0)return;if(e.type==="panmove"){currentTransform.tx=fromX+e.deltaX;currentTransform.ty=fromY+e.deltaY;updateTransformMatrix()}else if(e.type==="panstart"){fromX=currentTransform.tx;fromY=currentTransform.ty}}function onWheel(e){var isZoomIn=e.deltaY<0;var direction=isZoomIn?1:-1;var factor=1+direction*.1;var x=e.offsetX===undefined?e.layerX:e.offsetX;var y=e.offsetY===undefined?e.layerY:e.offsetY;zoomTo(x,y,factor);e.preventDefault()}function zoomTo(x,y,factor){currentTransform.tx=x-factor*(x-currentTransform.tx);currentTransform.ty=y-factor*(y-currentTransform.ty);currentTransform.scale*=factor;updateTransformMatrix()}function addLayer(name,parent){var layer=svg("g").attr("id",name);parent.append(layer);return layer}function getModelPosition(pos){return{x:(pos.x-currentTransform.tx)/currentTransform.scale,y:(pos.y-currentTransform.ty)/currentTransform.scale}}function createSceneTransform(scene){var transform=svgRoot.createSVGTransform();scene.transform.baseVal.appendItem(transform);return transform}function moveTo(x,y){currentTransform.tx=x;currentTransform.ty=y;updateTransformMatrix()}function updateTransformMatrix(){sceneTransform.matrix.e=currentTransform.tx;sceneTransform.matrix.f=currentTransform.ty;sceneTransform.matrix.a=sceneTransform.matrix.d=currentTransform.scale}function onNodePan(pos,model){return function onNodePan(e){var clickPosition=getModelPosition(e.center);var status;resetStable();if(e.type==="panmove"){status=panSession[model.id];layout.setNodePosition(model.id,clickPosition.x-status.dx,clickPosition.y-status.dy)}else if(e.type==="panstart"){panSession[model.id]={isPinned:layout.isNodePinned(model),dx:clickPosition.x-pos.x,dy:clickPosition.y-pos.y};layout.pinNode(model,true);panNode+=1}else if(e.type==="panend"){status=panSession[model.id];if(status)layout.pinNode(model,status.isPinned);panNode-=1;if(panNode<0)panNode=0}}}function releaseDOMEvents(){for(var key in nodes){var descriptor=nodes[key];if(descriptor.events)descriptor.events.destroy()}}function removeNode(node){var descriptor=nodes[node.id];if(!descriptor)return;descriptor.events.destroy();var parent=descriptor.ui.parentNode;if(parent)parent.removeChild(descriptor.ui);delete nodes[node.id]}function removeLink(link){var descriptor=links[link.id];if(!descriptor)return;var parent=descriptor.ui.parentNode;if(parent)parent.removeChild(descriptor.ui);delete links[link.id]}function onScreenPinch(e){if(e.target!==svgRoot)return;if(e.type==="pinchstart"){screenPinchX=e.center.x;screenPinchY=e.center.y;lastScale=e.scale}else{var direction=lastScale>e.scale?-1:1;lastScale=e.scale;var factor=1+direction*.04;zoomTo(screenPinchX,screenPinchY,factor)}}}},{"./lib/defaultLayout.js":1,"./lib/defaultUI.js":2,hammerjs:3,"ngraph.events":4,simplesvg:22,wheel:26}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({"query-string":[function(require,module,exports){(function(){"use strict";var queryString={};queryString.parse=function(str){if(typeof str!=="string"){return{}}str=str.trim().replace(/^(\?|#)/,"");if(!str){return{}}return str.trim().split("&").reduce(function(ret,param){var parts=param.replace(/\+/g," ").split("=");var key=parts[0];var val=parts[1];key=decodeURIComponent(key);val=val===undefined?null:decodeURIComponent(val);if(!ret.hasOwnProperty(key)){ret[key]=val}else if(Array.isArray(ret[key])){ret[key].push(val)}else{ret[key]=[ret[key],val]}return ret},{})};queryString.stringify=function(obj){return obj?Object.keys(obj).map(function(key){var val=obj[key];if(Array.isArray(val)){return val.map(function(val2){return encodeURIComponent(key)+"="+encodeURIComponent(val2)}).join("&")}return encodeURIComponent(key)+"="+encodeURIComponent(val)}).join("&"):""};if(typeof define==="function"&&define.amd){define(function(){return queryString})}else if(typeof module!=="undefined"&&module.exports){module.exports=queryString}else{window.queryString=queryString}})()},{}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){module.exports=function(){var nodes={},links=[],multiEdges={},nodesCount=0,suspendEvents=0,changes=[],fireGraphChanged=function(graph){graph.fire("changed",changes)},enterModification=function(){suspendEvents+=1},exitModification=function(graph){suspendEvents-=1;if(suspendEvents===0&&changes.length>0){fireGraphChanged(graph);changes.length=0}},recordNodeChange=function(node,changeType){changes.push({node:node,changeType:changeType})},recordLinkChange=function(link,changeType){changes.push({link:link,changeType:changeType})},linkConnectionSymbol="👉 ";var graphPart={addNode:function(nodeId,data){if(typeof nodeId==="undefined"){throw new Error("Invalid node identifier")}enterModification();var node=this.getNode(nodeId);if(!node){node=new Node(nodeId);nodesCount++;recordNodeChange(node,"add")}else{recordNodeChange(node,"update")}node.data=data;nodes[nodeId]=node;exitModification(this);return node},addLink:function(fromId,toId,data){enterModification();var fromNode=this.getNode(fromId)||this.addNode(fromId);var toNode=this.getNode(toId)||this.addNode(toId);var linkId=fromId.toString()+linkConnectionSymbol+toId.toString();var isMultiEdge=multiEdges.hasOwnProperty(linkId);if(isMultiEdge||this.hasLink(fromId,toId)){if(!isMultiEdge){multiEdges[linkId]=0}linkId+="@"+ ++multiEdges[linkId]}var link=new Link(fromId,toId,data,linkId);links.push(link);fromNode.links.push(link);toNode.links.push(link);recordLinkChange(link,"add");exitModification(this);return link},removeLink:function(link){if(!link){return false}var idx=indexOfElementInArray(link,links);if(idx<0){return false}enterModification();links.splice(idx,1);var fromNode=this.getNode(link.fromId);var toNode=this.getNode(link.toId);if(fromNode){idx=indexOfElementInArray(link,fromNode.links);if(idx>=0){fromNode.links.splice(idx,1)}}if(toNode){idx=indexOfElementInArray(link,toNode.links);if(idx>=0){toNode.links.splice(idx,1)}}recordLinkChange(link,"remove");exitModification(this);return true},removeNode:function(nodeId){var node=this.getNode(nodeId);if(!node){return false}enterModification();while(node.links.length){var link=node.links[0];this.removeLink(link)}delete nodes[nodeId];nodesCount--;recordNodeChange(node,"remove");exitModification(this);return true},getNode:function(nodeId){return nodes[nodeId]},getNodesCount:function(){return nodesCount},getLinksCount:function(){return links.length},getLinks:function(nodeId){var node=this.getNode(nodeId);return node?node.links:null},forEachNode:function(callback){if(typeof callback!=="function"){return}var node;for(node in nodes){if(nodes.hasOwnProperty(node)){if(callback(nodes[node])){return}}}},forEachLinkedNode:function(nodeId,callback,oriented){var node=this.getNode(nodeId),i,link,linkedNodeId;if(node&&node.links&&typeof callback==="function"){if(oriented){for(i=0;i<node.links.length;++i){link=node.links[i];if(link.fromId===nodeId){callback(nodes[link.toId],link)}}}else{for(i=0;i<node.links.length;++i){link=node.links[i];linkedNodeId=link.fromId===nodeId?link.toId:link.fromId;callback(nodes[linkedNodeId],link)}}}},forEachLink:function(callback){var i,length;if(typeof callback==="function"){for(i=0,length=links.length;i<length;++i){callback(links[i])}}},beginUpdate:function(){enterModification()},endUpdate:function(){exitModification(this)},clear:function(){var that=this;that.beginUpdate();that.forEachNode(function(node){that.removeNode(node.id)});that.endUpdate()},hasLink:function(fromNodeId,toNodeId){var node=this.getNode(fromNodeId),i;if(!node){return null}for(i=0;i<node.links.length;++i){var link=node.links[i];if(link.fromId===fromNodeId&&link.toId===toNodeId){return link}}return null}};var eventify=require("ngraph.events");eventify(graphPart);return graphPart};function indexOfElementInArray(element,array){if(array.indexOf){return array.indexOf(element)}var len=array.length,i;for(i=0;i<len;i+=1){if(array[i]===element){return i}}return-1}function Node(id){this.id=id;this.links=[];this.data=null}function Link(fromId,toId,data,id){this.fromId=fromId;this.toId=toId;this.data=data;this.id=id}},{"ngraph.events":2}],2:[function(require,module,exports){module.exports=function(subject){validateSubject(subject);var eventsStorage=createEventsStorage(subject);subject.on=eventsStorage.on;subject.off=eventsStorage.off;subject.fire=eventsStorage.fire;return subject};function createEventsStorage(subject){var registeredEvents={};return{on:function(eventName,callback,ctx){if(typeof callback!=="function"){throw new Error("callback is expected to be a function")}if(!registeredEvents.hasOwnProperty(eventName)){registeredEvents[eventName]=[]}registeredEvents[eventName].push({callback:callback,ctx:ctx});return subject},off:function(eventName,callback){var wantToRemoveAll=typeof eventName==="undefined";if(wantToRemoveAll){registeredEvents={};return subject}if(registeredEvents.hasOwnProperty(eventName)){var deleteAllCallbacksForEvent=typeof callback!=="function";if(deleteAllCallbacksForEvent){delete registeredEvents[eventName]}else{var callbacks=registeredEvents[eventName];for(var i=0;i<callbacks.length;++i){if(callbacks[i].callback===callback){callbacks.splice(i,1)}}}}return subject},fire:function(eventName){var noEventsToFire=!registeredEvents.hasOwnProperty(eventName);if(noEventsToFire){return subject}var callbacks=registeredEvents[eventName];var fireArguments=Array.prototype.splice.call(arguments,1);for(var i=0;i<callbacks.length;++i){var callbackInfo=callbacks[i];callbackInfo.callback.apply(callbackInfo.ctx,fireArguments)}return subject}}}function validateSubject(subject){if(!subject){throw new Error("Eventify cannot use falsy object as events subject")}var reservedWords=["on","fire","off"];for(var i=0;i<reservedWords.length;++i){if(subject.hasOwnProperty(reservedWords[i])){throw new Error("Subject cannot be eventified, since it already has property '"+reservedWords[i]+"'")}}}},{}],3:[function(require,module,exports){module.exports={random:random,randomIterator:randomIterator};function random(inputSeed){var seed=typeof inputSeed==="number"?inputSeed:+new Date;var randomFunc=function(){seed=seed+2127912214+(seed<<12)&4294967295;seed=(seed^3345072700^seed>>>19)&4294967295;seed=seed+374761393+(seed<<5)&4294967295;seed=(seed+3550635116^seed<<9)&4294967295;seed=seed+4251993797+(seed<<3)&4294967295;seed=(seed^3042594569^seed>>>16)&4294967295;return(seed&268435455)/268435456};return{next:function(maxValue){return Math.floor(randomFunc()*maxValue)},nextDouble:function(){return randomFunc()}}}function randomIterator(array,customRandom){var localRandom=customRandom||random();if(typeof localRandom.next!=="function"){throw new Error("customRandom does not match expected API: next() function is missing")}return{forEach:function(callback){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t;callback(t)}if(array.length){callback(array[0])}},shuffle:function(){var i,j,t;for(i=array.length-1;i>0;--i){j=localRandom.next(i+1);t=array[j];array[j]=array[i];array[i]=t}return array}}}},{}],"ngraph.generators":[function(require,module,exports){module.exports={ladder:ladder,complete:complete,completeBipartite:completeBipartite,balancedBinTree:balancedBinTree,path:path,circularLadder:circularLadder,grid:grid,grid3:grid3,noLinks:noLinks,wattsStrogatz:wattsStrogatz};var createGraph=require("ngraph.graph");function ladder(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=createGraph(),i;for(i=0;i<n-1;++i){g.addLink(i,i+1);g.addLink(n+i,n+i+1);g.addLink(i,n+i)}g.addLink(n-1,2*n-1);return g}function circularLadder(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=ladder(n);g.addLink(0,n-1);g.addLink(n,2*n-1);return g}function complete(n){if(!n||n<1){throw new Error("At least two nodes are expected for complete graph")}var g=createGraph(),i,j;for(i=0;i<n;++i){for(j=i+1;j<n;++j){if(i!==j){g.addLink(i,j);g.addLink(j,i)}}}return g}function completeBipartite(n,m){if(!n||!m||n<0||m<0){throw new Error("Graph dimensions are invalid. Number of nodes in each partition should be greate than 0")}var g=createGraph(),i,j;for(i=0;i<n;++i){for(j=n;j<n+m;++j){g.addLink(i,j)}}return g}function path(n){if(!n||n<0){throw new Error("Invalid number of nodes")}var g=createGraph(),i;g.addNode(0);for(i=1;i<n;++i){g.addLink(i-1,i)}return g}function grid(n,m){if(n<1||m<1){throw new Error("Invalid number of nodes in grid graph")}var g=createGraph(),i,j;if(n===1&&m===1){g.addNode(0);return g}for(i=0;i<n;++i){for(j=0;j<m;++j){var node=i+j*n;if(i>0){g.addLink(node,i-1+j*n)}if(j>0){g.addLink(node,i+(j-1)*n)}}}return g}function grid3(n,m,z){if(n<1||m<1||z<1){throw new Error("Invalid number of nodes in grid3 graph")}var g=createGraph(),i,j,k;if(n===1&&m===1&&z===1){g.addNode(0);return g}for(k=0;k<z;++k){for(i=0;i<n;++i){for(j=0;j<m;++j){var level=k*n*m;var node=i+j*n+level;if(i>0){g.addLink(node,i-1+j*n+level)}if(j>0){g.addLink(node,i+(j-1)*n+level)}if(k>0){g.addLink(node,i+j*n+(k-1)*n*m)}}}}return g}function balancedBinTree(n){if(n<0){throw new Error("Invalid number of nodes in balanced tree")}var g=createGraph(),count=Math.pow(2,n),level;if(n===0){g.addNode(1)}for(level=1;level<count;++level){var root=level,left=root*2,right=root*2+1;g.addLink(root,left);g.addLink(root,right)}return g}function noLinks(n){if(n<0){throw new Error("Number of nodes shoul be >= 0")}var g=createGraph(),i;for(i=0;i<n;++i){g.addNode(i)}return g}function wattsStrogatz(n,k,p,seed){if(k>=n)throw new Error("Choose smaller `k`. It cannot be larger than number of nodes `n`");var random=require("ngraph.random").random(seed||42);var g=createGraph(),i,to;for(i=0;i<n;++i){g.addNode(i)}var neighborsSize=Math.floor(k/2+1);for(var j=1;j<neighborsSize;++j){for(i=0;i<n;++i){to=(j+i)%n;g.addLink(i,to)}}for(j=1;j<neighborsSize;++j){for(i=0;i<n;++i){if(random.nextDouble()<p){var from=i;to=(j+i)%n;var newTo=random.next(n);var needsRewire=newTo===from||g.hasLink(from,newTo);if(needsRewire&&g.getLinks(from).length===n-1){continue}while(needsRewire){newTo=random.next(n);needsRewire=newTo===from||g.hasLink(from,newTo)}var link=g.hasLink(from,to);g.removeLink(link);g.addLink(from,newTo)}}}return g}},{"ngraph.graph":1,"ngraph.random":3}]},{},[]);var createGraph=require("ngraph.graph");var createSvg=require("ngraph.svg");var QS=require("query-string");var graphGenerators=require("ngraph.generators");function render(svg){var query=QS.parse(window.location.search.substring(1));var graph=getGraphFromQueryString(query);var graphics=createSvg(graph,{interactive:true});graphics.run();return graphics.svgRoot}function getGraphFromQueryString(query){var createGraph=graphGenerators[query.graph]||graphGenerators.grid;return createGraph(getNumber(query.n),getNumber(query.m),getNumber(query.k))}function getNumber(string,defaultValue){var number=parseFloat(string);return typeof number==="number"&&!isNaN(number)?number:defaultValue||10}var svg;function draw(){if(!svg){svg=render()}svg.setAttribute("height",document.body.clientHeight);svg.setAttribute("width",document.body.clientWidth)}window.addEventListener("resize",draw);draw(); |
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
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"ngraph.graph": "0.0.4", | |
"ngraph.svg": "0.0.6", | |
"query-string": "1.0.0", | |
"ngraph.generators": "0.0.8" | |
} | |
} |
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
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; } | |
body, html { height: 100%; width: 100%; }</style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment