!function(a,b){"function"==typeofdefine&&define.amd?define(["underscore","backbone"],function(c,d){returnb(a,c,d)}):a.Cello=b(a,_,Backbone)}(this,function(a,b,c){functiond(a,b){returnMath.floor(Math.random()*(b-a+1))+a}vare={desc:"",version:.2,license:"!! TODO !!",DEBUG:!1};e.log=function(){console.log("INFO",arguments)},e.debug=function(){e.DEBUG&&console.log("DEBUG",arguments)},e.assert=function(a,c){if(!a){vard="Assertion failed";throwb.isArray(c)&&(d=c.join("\n")),c&&(d=c),newError(d)}},e.get=function(a,c,d){default_getter=function(){returne.assert(b(a).has("attributes")),e.assert(b(a.attributes).has(c)),a.attributes[c]},a.__defineGetter__(c,d||default_getter)},e.set=function(a,c,d){varf=function(d){e.assert(b(a).has("attributes"));varf=d;b(a).has("attributes")&&(b(a.attributes).has(c)&&(f=a.attributes[c]),a.attributes[c]=d,f!=d&&(a.trigger("change",a),a.trigger("change:"+c,a,d)))};a.__defineSetter__(c,d||f)},e.getset=function(a,b,c,d){e.get(a,b,c),e.set(a,b,d)},e.FlagableCollection=function(a){a.model.active_flags||[];b.each(a.model.active_flags,function(b){e.FlagMethod(a,b)}),a.by_flag=function(b){returna.filter(function(a){returna.has_flag(b)})},a._check_models_param=function(a){returna=b.isUndefined(a)?this.models:a,a=b.isNull(a)?[]:a,a=b.isArray(a)?a:[a]},a.set_flag=function(c,d){d=a._check_models_param(d);vare=a.by_flag(c),f=b.sortBy(d,f);b.isEqual(e,d)===!1&&a.add_flag(c,d,!0)},a.add_flag=function(c,d,e,f){vare=void0!==e&&e,g=a.by_flag(c);if(d=a._check_models_param(d),(0!=g.length||0!=d.length)&&b.isObject(d)){varh=b.union(d,e?[]:g),i=b.difference(g,h);b.difference(h,g);a.remove_flag(c,i,f),b.each(d,function(a){a.add_flag(c,f)})}},a.remove_flag=function(c,d,e){d=a._check_models_param(d),b.each(d,function(a){a.remove_flag(c,e)})}},e.Flagable=function(a){a.get("flags")||a.set("flags",[]),e.get(a,"flags"),a.add_flag=function(a,c){this.has_flag(a)||(this.set("flags",b.union(this.flags,[a]),{silent:!0}),c&&c.silent||(this.trigger("addflag",a,this),this.trigger("addflag:"+a,this)))},a.remove_flag=function(a,c){this.has_flag(a)&&(this.set("flags",b.without(this.flags,a),{silent:!0}),c&&c.silent||(this.trigger("rmflag",a,this),this.trigger("rmflag:"+a,this)))},a.has_flag=function(a){returnthis.flags||console.log(this),this.flags.indexOf(a)>=0}},e.FlagMethod=function(a,b){varc="add_"+b,d="set_"+b;e.assert(void0===a[c]),e.assert(void0===a[d]),a[d]=function(c){a.set_flag(b,c,!0)},a[c]=function(c,d){a.add_flag(b,c,d)}},e.SortableCollection=function(a,d,f,g){e.assert(b.isString(f)),e.assert(b.isObject(d)),a.sortables=newc.Collection([],{model:e.Sortable}),e.FlagableCollection(a.sortables),b(d).each(function(b){a.sortables.add(newe.Sortable(b))}),a.listenTo(a.sortables,"change:selected change:reversed",function(b){a.comparator=b.get_comparator(),a.sort()}),console.log(a.sortables);varh=a.sortables.findWhere({field:f});returne.assert(h,"invalid default_key ("+f+")"),h.select(),a.sort_reverse&&h.reverse(),a.comparator=h.get_comparator(),a},e.Sortable=c.Model.extend({defaults:{field:"",type:"",label:null},comparators:{alpha:function(a){varb=function(b,c){returnb.get(a).localeCompare(c.get(a))};returnb},numeric:function(a){varb=function(b,c){returnb.get(a)-c.get(a)==0?0:b.get(a)-c.get(a)>0?1:-1};returnb}},initialize:function(a,c){e.Flagable(this),e.get(this,"field"),e.get(this,"type"),e.get(this,"selected",function(){returnthis.has_flag("selected")}),e.get(this,"reversed",function(){returnthis.has_flag("reversed")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){this.collection.trigger("change:selected",this),this.collection.trigger("change")}),this.listenTo(this,"addflag:reversed rmflag:reversed",function(){this.collection.trigger("change:reversed",this),this.collection.trigger("change")}),b.has(a,"label")&&a.label||this.set("label",a.field);this.get_comparator();returnthis},get_comparator:function(){vara=this.type,c=null;if(b.isFunction(a))c=a(this.field);else{if(!b.has(this.comparators,a))throwError("comparator not found ! (type: '"+a+"')");c=this.comparators[a](this.field)}if(this.reversed){vard=c;c=function(a,b){returnd(b,a)}}returnc},select:function(){this.selected||(b(this.collection.by_flag("selected")).each(function(a){a.remove_flag("selected"),a.reversed&&a.remove_flag("reversed")}),this.add_flag("selected"))},reverse:function(){this.reversed||this.add_flag("reversed")},toggle_reverse:function(){this.reversed?this.remove_flag("reversed"):this.add_flag("reversed")}},{active_flags:["selected","reversed"]}),e.DocList=c.Collection.extend({model:e.Doc,initialize:function(a,c){b(this).bindAll("_set_sort_key","_set_sort_reverse","_set_sortables","_get_sort_key","_get_sort_reverse","_get_sortables"),c=c||{},e.get(this,"selected",function(){returnthis.has_flag("selected")});vard=c.sort_key||"title",f=c.sort_reverse||!1,g=c.sortables||[];this.model&&(e.FlagableCollection(this),e.SortableCollection(this,g,d,f))},_set_sort_key:function(a){varb=this.sort_key;this._sort_key=a,b!=this.sort_key&&(this.trigger("change"),this.trigger("change:sort_key"))},_get_sort_key:function(){returnthis._sort_key},_set_sort_reverse:function(a){varb=this.sort_reverse;this._sort_reverse=a,b!=this.sort_reverse&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sort_reverse:function(){returnthis._sort_reverse},_set_sortables:function(a){varb=this.sortables;this._sortables=a,b!=this.sortables&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sortables:function(){returnthis._sortables},select:function(a){a.select(),this.trigger("change:selected")},clear_selection:function(){this.set_selected(null),options&&options.silent||this.trigger("change:selected"),this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")}}),e.Doc=c.Model.extend({defaults:{docnum:null,selected:!1,clusters:null},idAttribute:"docnum",initialize:function(a,b){e.get(this,"docnum"),e.get(this,"selected",function(){returnthis.has_flag("selected")}),e.getset(this,"clusters"),this.clusters={},e.Flagable(this),e.assert(null!==this.docnum,"Document should have a docnum")},select:function(){this.add_flag("selected")},toggle_select:function(){this.selected?this.remove_flag("selected"):this.add_flag("selected")}},{active_flags:["selected"]}),e.QueryModel=c.Model.extend({defaults:{cellist:null,query:"",loaded:!1},loaded_query:null,initialize:function(a,c){b.bindAll(this,"set_query","play_completed","query_updated"),e.get(this,"cellist"),e.get(this,"loaded"),e.get(this,"query"),e.set(this,"query",this.set_query),this.listenTo(this.cellist,"play:complete",this.play_completed),this.on("change:query",this.query_updated)},set_query:function(a){a=a.trim(),console.log("set_query",a),this.set("query",a)},query_updated:function(){this.query!==this.loaded_query?this.set("loaded",!1):this.set("loaded",!0)},play_completed:function(a){a.results.query!=this.query&&(this.query=a.results.query),this.loaded_query=this.query,this.set("loaded",!0)},validate:function(){return!0},play:function(){this.cellist.play()},export_for_engine:function(){returnthis.query}}),e.Option=c.Model.extend({defaults:{value:void0,name:null,otype:{}},idAttribute:"name",initialize:function(a,c){vard=this;b.bindAll(this,"validate"),e.get(this,"name"),e.get(this,"otype"),e.get(this,"value"),e.set(this,"value",function(a){varb=d.validate(a);d.value!=b&&d.set("value",b)}),e.assert(null!==this.name,"Option should have a name"),e.assert(null!==a.otype,"(Option: "+this.name+") otype should not be 'null'")},is_default:function(){returnb.isEqual(this.value,this.otype.default)},cast:function(a){varb=function(a){returna};return"float"===this.otype.vtype&&(b=parseFloat),"int"===this.otype.vtype&&(b=parseInt),"Boolean"===this.otype.type&&(b=function(a){return[1,!0,"true","True","TRUE","1","yes"].indexOf(a)>=0}),b(a)},parse:function(a){varc=this;returnthis.otype&&("float"!==this.otype.vtype&&"int"!==this.otype.vtype||(this.otype.multi?(a=a.replace(/\s/g,"").split(",").filter(function(a){returna.length}).map(function(a){returnc.cast(a)}),b.isNaN(a)&&(a="")):(a=c.cast(a),b.isNaN(a)&&(a="")))),a},_validate_one:function(a){varc=this.otype.choices;if(c&&b.indexOf(c,a)<0)thrownewError("invalid option value");returna},is_multi:function(){returnthis.otype.multi},validate:function(a){varc=this;if(this.is_multi()){vard=[];b.each(a,function(a){d.push(c._validate_one(a))}),a=d}elsea=this._validate_one(a);returna}}),e.Options=c.Collection.extend({model:e.Option}),e.Component=c.Model.extend({idAttribute:"name",defaults:{name:null,selected:!1,doc:"",options:newe.Options},initialize:function(){e.get(this,"name"),e.get(this,"options"),e.get(this,"selected"),this.listenTo(this.options,"reset",this.optionsChanged),this.listenTo(this.options,"change",this.optionsChanged),e.assert(null!==this.name,"Component should have a name")},get_option:function(a){returnthis.options.where({name:a})[0]},set_option:function(a,b){varc=this.get_option(a);c.value=b},parse:function(a,b){returna.options=newe.Options(a.options,{parse:!0}),a.default&&(a.selected=!0),a},optionsChanged:function(a){this.trigger("change",this,a),this.trigger("change:options",this,a)},changed_options:function(){vara=[];returnb.each(this.options.models,function(b){b.is_default()||a.push(b)}),a},as_dict:function(a){void0!==a&&null!=a||(a=!1);varc={name:this.name},d=a?this.changed_options():this.options.models;returnd.length>0&&(c.options={},b.each(d,function(a){c.options[a.name]=a.value})),c},set_state:function(a){varc=this;b.each(a,function(a,b){c.set_option(b,a)})}}),e.Components=c.Collection.extend({model:e.Component}),e.Block=c.Model.extend({defaults:{name:"",components:newe.Components,required:!0,multiple:!1,args:null,returns:null},initialize:function(a){e.get(this,"components"),e.get(this,"selected",this._get_selected),e.get(this,"name"),e.get(this,"required"),e.get(this,"multiple"),e.get(this,"args"),e.get(this,"returns"),e.assert(null!==this.name,"Block should have a name"),e.assert(b.isNull(this.args)||b.isArray(this.args),"'args' should be null or an Array"),null===this.returns&&this.set("returns",this.name),this.listenTo(this.components,"reset",this.componentsChanged),this.listenTo(this.components,"change",this.componentsChanged),this.selection_default=b.map(this.selected,function(a){returna.name})},componentsChanged:function(a){this.trigger("change",this,a),this.trigger("change:components",this,a)},parse:function(a,b){returna.components=newe.Components(a.components,{parse:!0}),a},reset:function(){this.components.reset()},get_component:function(a){returnb.find(this.components.models,function(b){returnb.name==a})},_get_selected:function(){returnthis.components.where({selected:!0})},select:function(a){a.selected?this.required||(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected")):(this.multiple||b.each(this.selected,function(a){a.set("selected",!1)}),a.set("selected",!0),this.trigger("change"),this.trigger("change:selected"))},unselect:function(a){a.selected&&(!this.required||this.multiple&&this.selected.length>1)&&(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected"))},clear_selection:function(){vara=this;b.each(this.selected,function(b){a.unselect(b)})},validate:function(){},get_state:function(a){void0!==a&&null!=a||(a=!1);varc=[],d=this.selected,e=b.isEqual(b.map(d,function(a){returna.name}),this.selection_default);for(varfind){varg=d[f],h=g.as_dict(a);a&&e&&!b.has(h,"options")||c.push(g.as_dict(a))}returnc},set_state:function(a){varc=this;b.each(a,function(a){varb=a.name,d=a.options,e=c.get_component(b);e.set_state(d),c.select(e)})}}),e.Blocks=c.Collection.extend({model:e.Block}),e.Engine=c.Model.extend({defaults:{blocks:newe.Blocks,args:null,returns:null,needed_inputs:[]},initialize:function(a,b){varc=a.url;this.input_models={},this.url=c,this.play_url=c,e.get(this,"blocks"),e.get(this,"args"),e.get(this,"returns"),e.get(this,"needed_inputs"),this.listenTo(this.blocks,"change reset",this.blockChanged)},get_block:function(a){returnb.find(this.blocks.models,function(b){returnb.get("name")==a})},blockChanged:function(a){this._update_needed_inputs(),this.trigger("change",this,a),this.trigger("change:blocks",this,a)},_update_needed_inputs:function(){vara=[],b=[],c=this.blocks.models;for(vardinc){vare=c[d];if(e.selected.length>0){for(varfine.args){varg=e.args[f];b.indexOf(g)<0&&a.indexOf(g)&&a.push(g)}b.push(e.returns)}}this.set({needed_inputs:a},{silent:!0})},parse:function(a,b){returnconsole.log("Engine parse",a,b),this.data=a,a.blocks=newe.Blocks(a.blocks,{parse:!0}),a},reset:function(a){a=this.parse(a),this.set(a)},get_state:function(a){void0!==a&&null!=a||(a=!1);varb={},c=this.blocks.models;for(vardinc){vare=c[d],f=e.get_state(a);f.length>0&&(b[e.name]=f)}returnb},set_state:function(a){varc=this;b.each(a,function(a,b){vard=c.get_block(b);d.set_state(a)})},get_state_str:function(a){varb=this.get_state(a),c=$.param(b);returnc},set_state_str:function(a){varb=e.utils.deparam(a);this.set_state(b)},register_input:function(a,b){this.input_models[a]=b},play:function(a){vard=this,f=this.get_state(),g={};b.each(this.input_models,function(a,b,c){g[b]=a.export_for_engine()});varg=b.extend(g,a),h=b.extend({},g,{options:f});e.log("play",h),d.trigger("play:loading",g,f);varh=JSON.stringify(h);c.ajax({url:d.play_url,method:"post",contentType:"application/json",data:h,success:function(b,c,e){b.meta&&b.meta.errors&&b.meta.errors.length>0?d.trigger("play:error",b,e):(console.log("play:success",b,a,f),d.trigger("play:success",b,a,f),d.trigger("play:complete",b,a,f))},error:function(a,b,c){d.trigger("play:error",{},a),d.trigger("play:complete",{},a)}})}});varf=c.Model.extend({IN:1,OUT:2,ALL:4,defaults:{gid:null,directed:!1,bipartite:!1},idAttribute:"gid",initialize:function(a,b){vard=this;if(this.edge_list={},this.nodetype_model=a.nodetype_model||h,this.nodetypes=newp([],{model:this.nodetype_model}),this.edgetype_model=a.edgetype_model||j,this.edgetypes=newp([],{model:this.edgetype_model}),this.properties||(this.properties=newc.Model),this.meta||(this.meta=newc.Model),e.get(this,"label",function(){returnthis.properties.get("name")}),this.urlRoot=a.urlRoot,this.urlRoot){varf=function(a){d.nodetypes.url=d.url()+"/nodetypes",d.nodetypes.reset(),d.nodetypes.fetch({remove:!1}),d.edgetypes.url=d.url()+"/edgetypes",d.edgetypes.reset(),d.edgetypes.fetch({remove:!1})};this.on("change:gid",f),this.nodetypes.on("add",function(a){a.urlRoot=d.url()+"/nodetype"}),this.edgetypes.on("add",function(a){a.urlRoot=d.url()+"/edgetype"})}this.vertex_model=a.vertex_model||l,this.vs=newe.Vertices([],{graph:this,model:this.vertex_model}),this.vs.reset([],{collection:this.vs});varg=function(a){a&&(a.collection=d.vs,void0===a.id&&(a.id=d.vs.size()),a.idind.edge_list||(d.edge_list[a.id]=[]))},i=function(a){varb=d.es.filter(function(b){returnb.get("source")==a.id||b.get("target")==a.id});d.es.remove(b),deleted.edge_list[a.id]};this.vs.on("add",g),this.vs.on("remove",i),this.edge_model=a.edge_model||m,this.es=newe.Edges([],{graph:this,model:this.edge_model}),this.es.reset([],{collection:this.es});vark=function(a){a.collection=d.es,d.edge_list[a.get("source")].push(a),d.edge_list[a.get("target")].push(a)},n=function(a){d.edge_list[a.get("source")].splice(d.edge_list[a.get("source")].indexOf(a),1),d.edge_list[a.get("target")].splice(d.edge_list[a.get("target")].indexOf(a),1)};this.es.on("add",k),this.es.on("remove",n),e.FlagableCollection(this.vs),e.FlagableCollection(this.es),a.data&&this.reset(a.data)},url:function(){returnthis.urlRoot+this.id},parse:function(a,b){this.reset(a[this.id],b)},reset:function(a,c){e.debug("parse graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{merge:!0,remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{merge:!0,remove:!1,parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),c=c?b.clone(c):{},a.vs&&a.es&&(this.edge_list={},this.es.reset([],c),this.vs.reset([],c),c={parse:!0},this.vs.set(a.vs,c),this.es.set(a.es,c)),this.trigger("reset")},merge:function(a,b){e.debug("merge graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{remove:!1,parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),this.vs.add(a.vs,{parse:!0}),this.es.add(a.es,{parse:!0}),this.trigger("merge")},get_edge_type:function(a){varb=this.edgetypes.get(a);if(b)returnb},get_node_type:function(a){varb=this.nodetypes.get(a);if(b)returnb},summary:function(){return{attrs:this.attributes,vcount:this.vcount(),ecount:this.ecount(),density:this.density(),v_attrs:this.attributes.v_attrs,e_attrs:this.attributes.e_attrs}},str:function(){vara=b.template("v:<%=vcount%>, e:<%=ecount%>,density:<%=density%>,\nv attrs:<%=v_attrs%>, \ne attrs:<%=e_attrs%>, ");returna(this.summary())},add_vertex:function(a){this.vs.add(a)},vcount:function(){returnthis.vs.length},add_edge:function(a){this.es.add(a)},is_loop:function(a){varc=function(a){returna.source===a.target};returnb.map(a,c)},ecount:function(){returnthis.es.length},incident:function(a,c,d){vare=this,f=[],g=a.id,h=void0===c?this.ALL:c,i=void0===d||d;returnh==e.ALL?f=b.filter(e.edge_list[g],function(a){return!!i||!a.is_loop()}):h==e.IN?f=b.filter(e.edge_list[g],function(a){return!(a.source.id!=g||!i&&a.is_loop())}):h==e.OUT&&(f=b.filter(e.edge_list[g],function(a){return!(a.target.id!=g||!i&&a.is_loop())})),f},degree:function(a,b,c){returnthis.incident(a,b,c).length},neighbors:function(a,c,d){vare=this.incident(a,c,d),f=b(e).map(function(b){returnb.source!=a?b.source:b.target});returnf},strength:function(a,c,d){vare=this.incident(a,c,d),f=function(a,b){returna+b.weight};returnb.reduce(e,f,0)},select:function(a){varc={degree:1,strength:1},d=function(d){for(vareina){varf,g=a[e],h=e.split(":"),i=h[0],j=2==h.length?h[1]:"eq";if("_"==i.substring(0,1)?(method=i.slice(1),methodinc&&(f=d[method]())):f=d.get(i),"eq"==j){if(b.isEqual(f,g)===!1)return!1}elseif("ne"==j){if(f==g)return!1}elseif("lt"==j){if(f<g==!1)return!1}elseif("gt"==j){if(f>g==!1)return!1}elseif("le"==j){if(f<=g==!1)return!1}elseif("ge"==j){if(f>=g==!1)return!1}elseif("in"==j){if(b.indexOf(g,f)===-1)return!1}elseif("notin"==j&&b.indexOf(g,f)!==-1)return!1}return!0};returnb.filter(this.vs.models,d)},random_vertex:function(){vara=this.es.at(d(0,this.es.size()-1));returnMath.random()>.5?a.source:a.target},density:function(){return2*this.es.length/(this.vs.length*(this.vs.length-1))},adjacency:function(){vara=[],c=0,d=function(){return0};for(c=this.vcount(),i=0;i<c;i++)a.push(b.range(c).map(d));for(c=this.ecount(),i=0;i<c;i++){vare=this.es[i];a[e.source][e.target]=e.weight}this.adjacency=a}}),g=c.Model.extend({idAttribute:"uuid",defaults:{name:"",count:0,description:"",type_attributes:{},properties:newe.Options,material:{}},get_property:function(a){returnthis.properties.where({name:a})[0]},add_property:function(a,b){},delete_property:function(a,b){},parse:function(a,b){varc=[];for(kina.properties)c.push({name:k,otype:a.properties[k]});return{type_attributes:a.type_attributes,properties:newe.Options(c,{parse:!0}),name:a.name,description:a.description||"",uuid:a.uuid}},toString:function(){returnthis.get("name")},toJSON:function(a){varc=b.pick(this.attributes,"name","description","uuid","type_attributes"),d=this.get("properties").models,e={};for(varfind){varg=d[f];""!=g.get("name")&&(e[g.get("name")]=g.get("otype"))}returnc.properties=e,c}}),h=g.extend({initialize:function(a,b){e.get(this,"count"),e.get(this,"name"),e.get(this,"properties"),e.get(this,"type_attributes",function(){returnthis.get("type_attributes")}),e.get(this,"label",function(){vara=this.get("name");returnvoid0===a?"":a});vard=this;this.on("sync",function(a,b,d){c.trigger("nodetype:save",this,b,d)}),this.listenTo(this.attributes.properties,"change",function(){d.trigger("change:properties",d.attributes.properties)})},parse_label:function(){vara=this.label,b={};returnb.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")):a,b}}),j=g.extend({initialize:function(a,b){e.get(this,"name"),e.get(this,"count"),e.get(this,"type_attributes",function(){returnthis.get("type_attributes")}),e.get(this,"properties"),e.get(this,"label",function(){vara=this.get("name");returnvoid0===a?"":a}),this.on("sync",function(a,b,d){c.trigger("edgetype:save",this,b,d)})}}),l=c.Model.extend({idAttribute:"uuid",defaults:{uuid:"",nodetype:"",label:"",color:[0,0,0],coords:[0,0,0]},initialize:function(a,d){varf=this;e.get(this,"graph",function(){returnnull!=f.collection?f.collection.graph:null}),e.get(this,"type",function(){returnthis.nodetype}),e.get(this,"nodetype",function(){returnf.graph?f.graph.get_node_type(f.get("nodetype")):null}),e.get(this,"properties",function(){returnf.get("properties")}),this.properties||this.set("properties",newc.Model),e.get(this,"label",function(){vara=f.properties.get("label");returnvoid0===a?"":a}),e.get(this,"formatted_label",this.format_label),this.clusters={},e.getset(f,"color"),this.on("sync",function(a,b,d){c.trigger("node:save",f,b,d)}),this.on("change:cl_color",function(a){a.set("color",a.get("cl_color"))}),this.on("change",function(a){a._neighbors=null}),e.Flagable(this),b.bindAll(this,"degree","format_label","neighbors","strength")},getHexColor:function(){return0},format_label:function(a){varb=this.label;returna&&(b=b.substring(0,a)),[{form:b,css:".normal-font"}]},degree:function(a,b){returnthis.graph.degree(this,a,b)},strength:function(a,b){returnthis.graph.strength(this,a,b)},incident:function(a,b){returnthis.graph.incident(this,a,b)},neighbors:function(a,b){returnthis.graph.neighbors(this,a,b)}},{active_flags:[]}),m=c.Model.extend({idAttribute:"uuid",defaults:{},constructor:function(){c.Model.apply(this,arguments);vara=this;e.get(this,"graph",function(){returnnull!=a.collection?a.collection.graph:null}),e.get(this,"type",function(){returna.edgetype}),e.get(this,"edgetype",function(){returna.graph?a.graph.get_edge_type(a.get("edgetype")):null}),e.get(this,"source",function(){returna.graph?a.graph.vs.get(a.get("source")):null}),e.get(this,"target",function(){returna.graph?a.graph.vs.get(a.get("target")):null}),e.get(this,"weight",function(){returna.graph?a.properties.get("weight"):1}),e.get(this,"sym",this.sym),e.get(this,"properties",function(){returna.get("properties")}),e.get(this,"label",function(){varb=a.properties.get("label");returnnull!=b&&0!=b.length||!a.edgetype?b:a.edgetype.name}),this.properties||this.set("properties",newc.Model),e.Flagable(this),this.on("sync",function(a,b,d){c.trigger("edge:save",a,b,d)})},str:function(){vara=function(a,b){returnb+": "+a};return"("+this.get("s")+","+this.get("t")+") "+this.source.label+"-->"+this.target.label+","+b.map(this.attributes,a).join(", ")},tuple:function(){},sym:function(){returnb(this.collection.models).findWhere({source:this.target,target:this.source})},is_loop:function(){returnthis.source.id==this.target.id}},{active_flags:[]}),n=c.Collection.extend({model:l,initialize:function(a,b){_this=this,b&&(this.graph=b.graph)},copy_attr:function(a,c,d){b.map(this.graph.vs.select({}),function(b){b.set(c,b.get(a),d)})},select:function(a){returnthis.graph.select(a)}}),o=c.Collection.extend({model:m,initialize:function(a,b){this.graph=b.graph},between:function(a,b,c){if(a&&b)returnthis.models.filter(function(d){returnc?d.source==a&d.target==b:(d.source==a|d.source==b)&(d.target==a|d.target==b)})}}),p=c.Collection.extend({model:g,parse:function(a){return"nodetypes"ina?a.nodetypes:"edgetypes"ina?a.edgetypes:void0}});e.Graph=f,e.Type=g,e.Vertices=n,e.Vertex=l,e.Edges=o,e.Edge=m,e.EdgeType=j,e.NodeType=h,e.ClusterLabel=c.Model.extend({idAttribute:"id",defaults:{label:"",score:1,role:"*",size:12,clusters:null},initialize:function(){e.get(this,"label"),e.get(this,"role"),e.get(this,"score"),e.getset(this,"clusters"),this.clusters={},b.bindAll(this,"_format_label"),e.get(this,"formatted_label",this._format_label),e.Flagable(this)},_format_label:function(){return[{form:this.get("label"),css:"normal"}]}},{active_flags:[]}),e.Cluster=c.Model.extend({defaults:{members:{},labels:[],misc:!1,selected:!1,color:[200,200,200]},initialize:function(a,c){vard=this;b.bindAll(d,"_compute_membership","_compute_colors"),e.get(this,"members"),e.getset(this,"labels"),e.get(this,"misc"),e.getset(this,"color"),e.get(this,"selected",function(){returnd.has_flag("selected")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){d.collection.trigger("change:selected")}),e.Flagable(this)},is_misc:function(){returnthis.misc},select:function(a){a?this.collection.set_selected([this]):this.add_flag("selected")},toggle_select:function(a){varb=this.collection.selected.length;this.selected?a&&b>=2?this.collection.set_selected([this]):this.remove_flag("selected"):this.select(a)},some_selected:function(){returnthis.selected||this.collection.by_flag("selected")},_compute_membership:function(){vara=this,c=this.collection.clustering.cid;b(a.members).each(function(b){b.each(function(b){vard={cluster:a};b.clusters[c]?b.clusters[c].push(d):b.clusters[c]=[d],b.trigger("change:clusters"),b.trigger("change:clusters:"+c)})})},_compute_colors_old:function(){vara=this.collection.length,b=this.collection.clustering.get("color_value"),c=this.collection.clustering.get("color_saturation"),d=this.collection.indexOf(this),f=[99,99,99];this.misc===!1&&(f=e.utils.hsvToRgb(d/a*360|0,c,b)),this.color=f},_compute_colors:function(a){if(this.misc===!0)returnvoid(this.color=[99,99,99]);varc=(this.collection.length,this.collection.clustering.get("color_value")),d=this.collection.clustering.get("color_saturation"),f=(this.collection.indexOf(this),[0,0,0]),g=f,h=0,i={};this.members.vs.each(function(a){varb=a.get("cl_color");s_last_node_cl_color=b.toString(),i[s_last_node_cl_color]?i[s_last_node_cl_color]++:i[s_last_node_cl_color]=1,i[s_last_node_cl_color]>h&&(h=i[s_last_node_cl_color],g=b)}),cluster_color=g;for(varj=0;b.isEqual(cluster_color,f)|a.indexOf(cluster_color.toString())!=-1;)cluster_color=e.utils.hsvToRgb(1*j*222.23%360|0,d,c),j++;a.push(cluster_color.toString()),this.color=cluster_color}},{active_flags:["selected"]}),e.ClustersList=c.Collection.extend({model:e.Cluster,initialize:function(a,b){_this=this,e.get(this,"selected",function(){returnthis.by_flag("selected")}),e.assert(b.clustering,"options.clustering is needed"),this.clustering=b.clustering,this.on("add remove reset",function(){vara=[];this.each(function(b){b._compute_membership(),b._compute_colors(a)})}),this.listenTo(this.clustering,"change:color_saturation change:color_value",function(){vara=[];this.each(function(b){b._compute_colors(a)})})},some_selected:function(){returnthis.by_flag("selected").length>0},select:function(a,b){a.select(b),this.trigger("change:selected",a)},clear_selection:function(a){this.set_selected(null),a&&a.silent||this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")},has_misc:function(){vara=function(a){returna.is_misc()};returnb.some(this.models,a)},cluster:function(a){returnthis.at(a)}}),e.Clustering=c.Model.extend({defaults:{clusters:null,members:{},color_value:80,color_saturation:40},ClusterLabelModel:e.ClusterLabel,ClusterModel:e.Cluster,ClustersCollection:e.ClustersList,initialize:function(a,b){a=a||{},e.getset(this,"members"),e.getset(this,"clusters"),e.getset(this,"color_value"),e.getset(this,"color_saturation"),this.ClusterLabelModel=a.ClusterLabelModel||this.ClusterLabelModel,this.ClusterModel=a.ClusterModel||this.ClusterModel,this.ClustersCollection=a.ClustersCollection||this.ClustersCollection;varc={clustering:this,model:this.ClusterModel},d=newthis.ClustersCollection([],c);this.set("clusters",d),e.FlagableCollection(this.clusters)},reset:function(a,c){vard=this,e=b(a).clone();c&&c.members&&b.extend(this.members,c.members);varf=this.members;b.map(e.clusters,function(a){a.misc=!1}),e.misc>-1&&(e.clusters[e.misc].misc=!0),cluster_models=[],b.each(e.clusters,function(a){cluster_members={},b.each(f,function(c,d){source_clone=c.source.clone(),source_filtered=source_clone.filter(function(d){returnb(a[c.id_field]).contains(d.id)}),source_clone.reset(source_filtered,{silent:!0}),cluster_members[d]=source_clone}),cluster_models.push(newd.ClusterModel({members:cluster_members,misc:a.misc}))}),this.clusters.reset(cluster_models),this.trigger("reset")},set_labels:function(a,b){this.clusters.each(function(b,c){b.labels=a.labels[c]})}}),e.utils={},e.utils.asEvents=function(a){varb;return{on:function(c,d){if(b)thrownewError("this is one off wrapper");a.addEventListener(c,d,!1),b=[c,d]},off:function(){a.removeEventListener.apply(a,b)}}};varq=function(a){returna="0"+a.toString(16),a.substring(a.length-2)};returne.utils.css_color=function(a){varc="#000000";returna&&(c="#"+b.map(a,q).join("")),c},e.utils.css_gradient=function(a,b){return"-webkit-linear-gradient("+e.utils.css_color(a)+","+e.utils.css_color(b)+")"},e.utils.color_darker=function(a){varb=e.utils.rgbToHsv(a[0],a[1],a[2]);returne.utils.hsvToRgb(b[0],b[1],60)},e.utils.hsvToRgb=function(a,b,c){b/=100,c/=100;vard=Math.floor(a/60%6),e=a/60-d,f=c*(1-b),g=c*(1-e*b),h=c*(1-(1-e)*b),i=[];switch(d){case0:i=[c,h,f];break;case1:i=[g,c,f];break;case2:i=[f,c,h];break;case3:i=[f,g,c];break;case4:i=[h,f,c];break;case5:i=[c,f,g]}varj=Math.min(255,256*i[0]|0),k=Math.min(255,256*i[1]|0),l=Math.min(255,256*i[2]|0);return[j,k,l]},e.utils.rgbToHsv=function(a,b,c){vard,e,f=a/255,g=b/255,h=c/255,i=Math.min(Math.min(f,g),h),j=Math.max(Math.max(f,g),h),k=j;returnj==i?e=0:j==f?e=60*((g-h)/(j-i))%360:j==g?e=60*((h-f)/(j-i))+120:j==h&&(e=60*((f-g)/(j-i))+240),e<0&&(e+=360),d=0===j?0:1-i/j,[0|e,100*d|0,100*k|0]},e.utils.addCSSRule=function(a,b,c){for(vard,e,f=0;f<document.styleSheets.length;f++){d=document.styleSheets[f],e=d.cssRules||d.rules;for(varg=a.toLowerCase(),h=0,i=e.length;h<i;h++)if(e[h].selectorText&&e[h].selectorText.toLowerCase()==g){if(null!==c)returnvoid(e[h].style[b]=c);d.deleteRule?d.deleteRule(h):d.removeRule?d.removeRule(h):e[h].style.cssText=""}}d=document.styleSheets[0]||{},d.insertRule?(e=d.cssRules||d.rules,d.insertRule(a+"{ "+b+":"+c+"; }",e.length)):d.addRule&&d.addRule(a,b+":"+c+";",0)},e.utils.deparam=function(a,b){varc={},d={true:!0,false:!1,null:null};return$.each(a.replace(/\+/g," ").split("&"),function(a,e){varf,g=e.split("="),h=decodeURIComponent(g[0]),i=c,j=0,k=h.split("]["),l=k.length-1;if(/\[/.test(k[0])&&/\]$/.test(k[l])?(k[l]=k[l].replace(/\]$/,""),k=k.shift().split("[").concat(k),l=k.length-1):l=0,2===g.length)if(f=decodeURIComponent(g[1]),b&&(f=f&&!isNaN(f)?+f:"undefined"===f?void0:void0!==d[f]?d[f]:f),l)for(;j<=l;j++)h=""===k[j]?i.length:k[j],i=i[h]=j<l?i[h]||(k[j+1]&&isNaN(k[j+1])?{}:[]):f;else$.isArray(c[h])?c[h].push(f):void0!==c[h]?c[h]=[c[h],f]:c[h]=f;elseh&&(c[h]=b?void0:"")}),c},e.utils.piwikTrackCurrentUrl=function(){b.isUndefined(window._paq)||"function"!=typeofwindow._paq.push||(window._paq.push(["setCustomUrl",window.location.href]),window._paq.push(["trackPageView"]))},e});
!function(a,b){"function"==typeofdefine&&define.amd?define(["underscore","backbone"],function(c,d){returnb(a,c,d)}):a.Cello=b(a,_,Backbone)}(this,function(a,b,c){functiond(a,b){returnMath.floor(Math.random()*(b-a+1))+a}vare={desc:"",version:.2,license:"!! TODO !!",DEBUG:!1};e.log=function(){console.log("INFO",arguments)},e.debug=function(){e.DEBUG&&console.log("DEBUG",arguments)},e.assert=function(a,c){if(!a){vard="Assertion failed";throwb.isArray(c)&&(d=c.join("\n")),c&&(d=c),newError(d)}},e.get=function(a,c,d){default_getter=function(){returne.assert(b(a).has("attributes")),e.assert(b(a.attributes).has(c)),a.attributes[c]},a.__defineGetter__(c,d||default_getter)},e.set=function(a,c,d){varf=function(d){e.assert(b(a).has("attributes"));varf=d;b(a).has("attributes")&&(b(a.attributes).has(c)&&(f=a.attributes[c]),a.attributes[c]=d,f!=d&&(a.trigger("change",a),a.trigger("change:"+c,a,d)))};a.__defineSetter__(c,d||f)},e.getset=function(a,b,c,d){e.get(a,b,c),e.set(a,b,d)},e.FlagableCollection=function(a){a.model.active_flags||[];b.each(a.model.active_flags,function(b){e.FlagMethod(a,b)}),a.by_flag=function(b){returna.filter(function(a){returna.has_flag(b)})},a._check_models_param=function(a){returna=b.isUndefined(a)?this.models:a,a=b.isNull(a)?[]:a,a=b.isArray(a)?a:[a]},a.set_flag=function(c,d){d=a._check_models_param(d);vare=a.by_flag(c),f=b.sortBy(d,f);b.isEqual(e,d)===!1&&a.add_flag(c,d,!0)},a.add_flag=function(c,d,e,f){vare=void0!==e&&e,g=a.by_flag(c);if(d=a._check_models_param(d),(0!=g.length||0!=d.length)&&b.isObject(d)){varh=b.union(d,e?[]:g),i=b.difference(g,h);b.difference(h,g);a.remove_flag(c,i,f),b.each(d,function(a){a.add_flag(c,f)})}},a.remove_flag=function(c,d,e){d=a._check_models_param(d),b.each(d,function(a){a.remove_flag(c,e)})}},e.Flagable=function(a){a.get("flags")||a.set("flags",[]),e.get(a,"flags"),a.add_flag=function(a,c){this.has_flag(a)||(this.set("flags",b.union(this.flags,[a]),{silent:!0}),c&&c.silent||(this.trigger("addflag",a,this),this.trigger("addflag:"+a,this)))},a.remove_flag=function(a,c){this.has_flag(a)&&(this.set("flags",b.without(this.flags,a),{silent:!0}),c&&c.silent||(this.trigger("rmflag",a,this),this.trigger("rmflag:"+a,this)))},a.has_flag=function(a){returnthis.flags||console.log(this),this.flags.indexOf(a)>=0}},e.FlagMethod=function(a,b){varc="add_"+b,d="set_"+b;e.assert(void0===a[c]),e.assert(void0===a[d]),a[d]=function(c){a.set_flag(b,c,!0)},a[c]=function(c,d){a.add_flag(b,c,d)}},e.SortableCollection=function(a,d,f,g){e.assert(b.isString(f)),e.assert(b.isObject(d)),a.sortables=newc.Collection([],{model:e.Sortable}),e.FlagableCollection(a.sortables),b(d).each(function(b){a.sortables.add(newe.Sortable(b))}),a.listenTo(a.sortables,"change:selected change:reversed",function(b){a.comparator=b.get_comparator(),a.sort()}),console.log(a.sortables);varh=a.sortables.findWhere({field:f});returne.assert(h,"invalid default_key ("+f+")"),h.select(),a.sort_reverse&&h.reverse(),a.comparator=h.get_comparator(),a},e.Sortable=c.Model.extend({defaults:{field:"",type:"",label:null},comparators:{alpha:function(a){varb=function(b,c){returnb.get(a).localeCompare(c.get(a))};returnb},numeric:function(a){varb=function(b,c){returnb.get(a)-c.get(a)==0?0:b.get(a)-c.get(a)>0?1:-1};returnb}},initialize:function(a,c){e.Flagable(this),e.get(this,"field"),e.get(this,"type"),e.get(this,"selected",function(){returnthis.has_flag("selected")}),e.get(this,"reversed",function(){returnthis.has_flag("reversed")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){this.collection.trigger("change:selected",this),this.collection.trigger("change")}),this.listenTo(this,"addflag:reversed rmflag:reversed",function(){this.collection.trigger("change:reversed",this),this.collection.trigger("change")}),b.has(a,"label")&&a.label||this.set("label",a.field);this.get_comparator();returnthis},get_comparator:function(){vara=this.type,c=null;if(b.isFunction(a))c=a(this.field);else{if(!b.has(this.comparators,a))throwError("comparator not found ! (type: '"+a+"')");c=this.comparators[a](this.field)}if(this.reversed){vard=c;c=function(a,b){returnd(b,a)}}returnc},select:function(){this.selected||(b(this.collection.by_flag("selected")).each(function(a){a.remove_flag("selected"),a.reversed&&a.remove_flag("reversed")}),this.add_flag("selected"))},reverse:function(){this.reversed||this.add_flag("reversed")},toggle_reverse:function(){this.reversed?this.remove_flag("reversed"):this.add_flag("reversed")}},{active_flags:["selected","reversed"]}),e.DocList=c.Collection.extend({model:e.Doc,initialize:function(a,c){b(this).bindAll("_set_sort_key","_set_sort_reverse","_set_sortables","_get_sort_key","_get_sort_reverse","_get_sortables"),c=c||{},e.get(this,"selected",function(){returnthis.has_flag("selected")});vard=c.sort_key||"title",f=c.sort_reverse||!1,g=c.sortables||[];this.model&&(e.FlagableCollection(this),e.SortableCollection(this,g,d,f))},_set_sort_key:function(a){varb=this.sort_key;this._sort_key=a,b!=this.sort_key&&(this.trigger("change"),this.trigger("change:sort_key"))},_get_sort_key:function(){returnthis._sort_key},_set_sort_reverse:function(a){varb=this.sort_reverse;this._sort_reverse=a,b!=this.sort_reverse&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sort_reverse:function(){returnthis._sort_reverse},_set_sortables:function(a){varb=this.sortables;this._sortables=a,b!=this.sortables&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sortables:function(){returnthis._sortables},select:function(a){a.select(),this.trigger("change:selected")},clear_selection:function(){this.set_selected(null),options&&options.silent||this.trigger("change:selected"),this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")}}),e.Doc=c.Model.extend({defaults:{docnum:null,selected:!1,clusters:null},idAttribute:"docnum",initialize:function(a,b){e.get(this,"docnum"),e.get(this,"selected",function(){returnthis.has_flag("selected")}),e.getset(this,"clusters"),this.clusters={},e.Flagable(this),e.assert(null!==this.docnum,"Document should have a docnum")},select:function(){this.add_flag("selected")},toggle_select:function(){this.selected?this.remove_flag("selected"):this.add_flag("selected")}},{active_flags:["selected"]}),e.QueryModel=c.Model.extend({defaults:{cellist:null,query:"",loaded:!1},loaded_query:null,initialize:function(a,c){b.bindAll(this,"set_query","play_completed","query_updated"),e.get(this,"cellist"),e.get(this,"loaded"),e.get(this,"query"),e.set(this,"query",this.set_query),this.listenTo(this.cellist,"play:complete",this.play_completed),this.on("change:query",this.query_updated)},set_query:function(a){a=a.trim(),console.log("set_query",a),this.set("query",a)},query_updated:function(){this.query!==this.loaded_query?this.set("loaded",!1):this.set("loaded",!0)},play_completed:function(a){a.results.query!=this.query&&(this.query=a.results.query),this.loaded_query=this.query,this.set("loaded",!0)},validate:function(){return!0},play:function(){this.cellist.play()},export_for_engine:function(){returnthis.query}}),e.Option=c.Model.extend({defaults:{value:void0,name:null,otype:{}},idAttribute:"name",initialize:function(a,c){vard=this;b.bindAll(this,"validate"),e.get(this,"name"),e.get(this,"otype"),e.get(this,"value"),e.set(this,"value",function(a){varb=d.validate(a);d.value!=b&&d.set("value",b)}),e.assert(null!==this.name,"Option should have a name"),e.assert(null!==a.otype,"(Option: "+this.name+") otype should not be 'null'")},is_default:function(){returnb.isEqual(this.value,this.otype.default)},cast:function(a){varb=function(a){returna};return"float"===this.otype.vtype&&(b=parseFloat),"int"===this.otype.vtype&&(b=parseInt),"Boolean"===this.otype.type&&(b=function(a){return[1,!0,"true","True","TRUE","1","yes"].indexOf(a)>=0}),b(a)},parse:function(a){varc=this;returnthis.otype&&("float"!==this.otype.vtype&&"int"!==this.otype.vtype||(this.otype.multi?(a=a.replace(/\s/g,"").split(",").filter(function(a){returna.length}).map(function(a){returnc.cast(a)}),b.isNaN(a)&&(a="")):(a=c.cast(a),b.isNaN(a)&&(a="")))),a},_validate_one:function(a){varc=this.otype.choices;if(c&&b.indexOf(c,a)<0)thrownewError("invalid option value");returna},is_multi:function(){returnthis.otype.multi},validate:function(a){varc=this;if(this.is_multi()){vard=[];b.each(a,function(a){d.push(c._validate_one(a))}),a=d}elsea=this._validate_one(a);returna}}),e.Options=c.Collection.extend({model:e.Option}),e.Component=c.Model.extend({idAttribute:"name",defaults:{name:null,selected:!1,doc:"",options:newe.Options},initialize:function(){e.get(this,"name"),e.get(this,"options"),e.get(this,"selected"),this.listenTo(this.options,"reset",this.optionsChanged),this.listenTo(this.options,"change",this.optionsChanged),e.assert(null!==this.name,"Component should have a name")},get_option:function(a){returnthis.options.where({name:a})[0]},set_option:function(a,b){varc=this.get_option(a);c.value=b},parse:function(a,b){returna.options=newe.Options(a.options,{parse:!0}),a.default&&(a.selected=!0),a},optionsChanged:function(a){this.trigger("change",this,a),this.trigger("change:options",this,a)},changed_options:function(){vara=[];returnb.each(this.options.models,function(b){b.is_default()||a.push(b)}),a},as_dict:function(a){void0!==a&&null!=a||(a=!1);varc={name:this.name},d=a?this.changed_options():this.options.models;returnd.length>0&&(c.options={},b.each(d,function(a){c.options[a.name]=a.value})),c},set_state:function(a){varc=this;b.each(a,function(a,b){c.set_option(b,a)})}}),e.Components=c.Collection.extend({model:e.Component}),e.Block=c.Model.extend({defaults:{name:"",components:newe.Components,required:!0,multiple:!1,args:null,returns:null},initialize:function(a){e.get(this,"components"),e.get(this,"selected",this._get_selected),e.get(this,"name"),e.get(this,"required"),e.get(this,"multiple"),e.get(this,"args"),e.get(this,"returns"),e.assert(null!==this.name,"Block should have a name"),e.assert(b.isNull(this.args)||b.isArray(this.args),"'args' should be null or an Array"),null===this.returns&&this.set("returns",this.name),this.listenTo(this.components,"reset",this.componentsChanged),this.listenTo(this.components,"change",this.componentsChanged),this.selection_default=b.map(this.selected,function(a){returna.name})},componentsChanged:function(a){this.trigger("change",this,a),this.trigger("change:components",this,a)},parse:function(a,b){returna.components=newe.Components(a.components,{parse:!0}),a},reset:function(){this.components.reset()},get_component:function(a){returnb.find(this.components.models,function(b){returnb.name==a})},_get_selected:function(){returnthis.components.where({selected:!0})},select:function(a){a.selected?this.required||(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected")):(this.multiple||b.each(this.selected,function(a){a.set("selected",!1)}),a.set("selected",!0),this.trigger("change"),this.trigger("change:selected"))},unselect:function(a){a.selected&&(!this.required||this.multiple&&this.selected.length>1)&&(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected"))},clear_selection:function(){vara=this;b.each(this.selected,function(b){a.unselect(b)})},validate:function(){},get_state:function(a){void0!==a&&null!=a||(a=!1);varc=[],d=this.selected,e=b.isEqual(b.map(d,function(a){returna.name}),this.selection_default);for(varfind){varg=d[f],h=g.as_dict(a);a&&e&&!b.has(h,"options")||c.push(g.as_dict(a))}returnc},set_state:function(a){varc=this;b.each(a,function(a){varb=a.name,d=a.options,e=c.get_component(b);e.set_state(d),c.select(e)})}}),e.Blocks=c.Collection.extend({model:e.Block}),e.Engine=c.Model.extend({defaults:{blocks:newe.Blocks,args:null,returns:null,needed_inputs:[]},initialize:function(a,b){varc=a.url;this.input_models={},this.url=c,this.play_url=c,e.get(this,"blocks"),e.get(this,"args"),e.get(this,"returns"),e.get(this,"needed_inputs"),this.listenTo(this.blocks,"change reset",this.blockChanged)},get_block:function(a){returnb.find(this.blocks.models,function(b){returnb.get("name")==a})},blockChanged:function(a){this._update_needed_inputs(),this.trigger("change",this,a),this.trigger("change:blocks",this,a)},_update_needed_inputs:function(){vara=[],b=[],c=this.blocks.models;for(vardinc){vare=c[d];if(e.selected.length>0){for(varfine.args){varg=e.args[f];b.indexOf(g)<0&&a.indexOf(g)&&a.push(g)}b.push(e.returns)}}this.set({needed_inputs:a},{silent:!0})},parse:function(a,b){returnconsole.log("Engine parse",a,b),this.data=a,a.blocks=newe.Blocks(a.blocks,{parse:!0}),a},reset:function(a){a=this.parse(a),this.set(a)},get_state:function(a){void0!==a&&null!=a||(a=!1);varb={},c=this.blocks.models;for(vardinc){vare=c[d],f=e.get_state(a);f.length>0&&(b[e.name]=f)}returnb},set_state:function(a){varc=this;b.each(a,function(a,b){vard=c.get_block(b);d.set_state(a)})},get_state_str:function(a){varb=this.get_state(a),c=$.param(b);returnc},set_state_str:function(a){varb=e.utils.deparam(a);this.set_state(b)},register_input:function(a,b){this.input_models[a]=b},play:function(a){vard=this,f=this.get_state(),g={};b.each(this.input_models,function(a,b,c){g[b]=a.export_for_engine()});varg=b.extend(g,a),h=b.extend({},g,{options:f});e.log("play",h),d.trigger("play:loading",g,f);varh=JSON.stringify(h);c.ajax({url:d.play_url,method:"post",contentType:"application/json",data:h,success:function(b,c,e){b.meta&&b.meta.errors&&b.meta.errors.length>0?d.trigger("play:error",b,e):(console.log("play:success",b,a,f),d.trigger("play:success",b,a,f),d.trigger("play:complete",b,a,f))},error:function(a,b,c){d.trigger("play:error",{},a),d.trigger("play:complete",{},a)}})}});varf=c.Model.extend({IN:1,OUT:2,ALL:4,defaults:{gid:null,directed:!1,bipartite:!1},idAttribute:"gid",initialize:function(a,b){vard=this;if(this.edge_list={},this.nodetype_model=a.nodetype_model||h,this.nodetypes=newp([],{model:this.nodetype_model}),this.edgetype_model=a.edgetype_model||j,this.edgetypes=newp([],{model:this.edgetype_model}),this.properties||(this.properties=newc.Model),this.meta||(this.meta=newc.Model),e.get(this,"label",function(){returnthis.properties.get("name")}),this.urlRoot=a.urlRoot,this.urlRoot){varf=function(a){d.nodetypes.url=d.url()+"/nodetypes",d.nodetypes.reset(),d.nodetypes.fetch({remove:!1}),d.edgetypes.url=d.url()+"/edgetypes",d.edgetypes.reset(),d.edgetypes.fetch({remove:!1})};this.on("change:gid",f),this.nodetypes.on("add",function(a){a.urlRoot=d.url()+"/nodetype"}),this.edgetypes.on("add",function(a){a.urlRoot=d.url()+"/edgetype"})}this.vertex_model=a.vertex_model||l,this.vs=newe.Vertices([],{graph:this,model:this.vertex_model}),this.vs.reset([],{collection:this.vs});varg=function(a){a&&(a.collection=d.vs,void0===a.id&&(a.id=d.vs.size()),a.idind.edge_list||(d.edge_list[a.id]=[]))},i=function(a){varb=d.es.filter(function(b){returnb.get("source")==a.id||b.get("target")==a.id});d.es.remove(b),deleted.edge_list[a.id]};this.vs.on("add",g),this.vs.on("remove",i),this.edge_model=a.edge_model||m,this.es=newe.Edges([],{graph:this,model:this.edge_model}),this.es.reset([],{collection:this.es});vark=function(a){a.collection=d.es,d.edge_list[a.get("source")].push(a),d.edge_list[a.get("target")].push(a)},n=function(a){d.edge_list[a.get("source")].splice(d.edge_list[a.get("source")].indexOf(a),1),d.edge_list[a.get("target")].splice(d.edge_list[a.get("target")].indexOf(a),1)};this.es.on("add",k),this.es.on("remove",n),e.FlagableCollection(this.vs),e.FlagableCollection(this.es),a.data&&this.reset(a.data)},url:function(){returnthis.urlRoot+this.id},parse:function(a,b){this.reset(a[this.id],b)},reset:function(a,c){e.debug("parse graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{merge:!0,remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{merge:!0,remove:!1,parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),c=c?b.clone(c):{},a.vs&&a.es&&(this.edge_list={},this.es.reset([],c),this.vs.reset([],c),c={parse:!0},this.vs.set(a.vs,c),this.es.set(a.es,c)),this.trigger("reset")},merge:function(a,b){e.debug("merge graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{remove:!1,parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),this.vs.add(a.vs,{parse:!0}),this.es.add(a.es,{parse:!0}),this.trigger("merge")},get_edge_type:function(a){varb=this.edgetypes.get(a);if(b)returnb},get_node_type:function(a){varb=this.nodetypes.get(a);if(b)returnb},summary:function(){return{attrs:this.attributes,vcount:this.vcount(),ecount:this.ecount(),density:this.density(),v_attrs:this.attributes.v_attrs,e_attrs:this.attributes.e_attrs}},str:function(){vara=b.template("v:<%=vcount%>, e:<%=ecount%>,density:<%=density%>,\nv attrs:<%=v_attrs%>, \ne attrs:<%=e_attrs%>, ");returna(this.summary())},add_vertex:function(a){this.vs.add(a)},vcount:function(){returnthis.vs.length},add_edge:function(a){this.es.add(a)},is_loop:function(a){varc=function(a){returna.source===a.target};returnb.map(a,c)},ecount:function(){returnthis.es.length},incident:function(a,c,d){vare=this,f=[],g=a.id,h=void0===c?this.ALL:c,i=void0===d||d;returnh==e.ALL?f=b.filter(e.edge_list[g],function(a){return!!i||!a.is_loop()}):h==e.IN?f=b.filter(e.edge_list[g],function(a){return!(a.source.id!=g||!i&&a.is_loop())}):h==e.OUT&&(f=b.filter(e.edge_list[g],function(a){return!(a.target.id!=g||!i&&a.is_loop())})),f},degree:function(a,b,c){returnthis.incident(a,b,c).length},neighbors:function(a,c,d){vare=this.incident(a,c,d),f=b(e).map(function(b){returnb.source!=a?b.source:b.target});returnf},strength:function(a,c,d){vare=this.incident(a,c,d),f=function(a,b){returna+b.weight};returnb.reduce(e,f,0)},select:function(a){varc={degree:1,strength:1},d=function(d){for(vareina){varf,g=a[e],h=e.split(":"),i=h[0],j=2==h.length?h[1]:"eq";if("_"==i.substring(0,1)?(method=i.slice(1),methodinc&&(f=d[method]())):f=d.get(i),"eq"==j){if(b.isEqual(f,g)===!1)return!1}elseif("ne"==j){if(f==g)return!1}elseif("lt"==j){if(f<g==!1)return!1}elseif("gt"==j){if(f>g==!1)return!1}elseif("le"==j){if(f<=g==!1)return!1}elseif("ge"==j){if(f>=g==!1)return!1}elseif("in"==j){if(b.indexOf(g,f)===-1)return!1}elseif("notin"==j&&b.indexOf(g,f)!==-1)return!1}return!0};returnb.filter(this.vs.models,d)},random_vertex:function(){vara=this.es.at(d(0,this.es.size()-1));returnMath.random()>.5?a.source:a.target},density:function(){return2*this.es.length/(this.vs.length*(this.vs.length-1))},adjacency:function(){vara=[],c=0,d=function(){return0};for(c=this.vcount(),i=0;i<c;i++)a.push(b.range(c).map(d));for(c=this.ecount(),i=0;i<c;i++){vare=this.es[i];a[e.source][e.target]=e.weight}this.adjacency=a}}),g=c.Model.extend({idAttribute:"uuid",defaults:{name:"",count:0,description:"",type_attributes:{},properties:newe.Options,material:{}},get_property:function(a){returnthis.properties.where({name:a})[0]},add_property:function(a,b){},delete_property:function(a,b){},parse:function(a,b){varc=[];for(kina.properties)c.push({name:k,otype:a.properties[k]});return{type_attributes:a.type_attributes,properties:newe.Options(c,{parse:!0}),name:a.name,description:a.description||"",uuid:a.uuid}},toString:function(){returnthis.get("name")},toJSON:function(a){varc=b.pick(this.attributes,"name","description","uuid","type_attributes"),d=this.get("properties").models,e={};for(varfind){varg=d[f];""!=g.get("name")&&(e[g.get("name")]=g.get("otype"))}returnc.properties=e,c}}),h=g.extend({initialize:function(a,b){e.get(this,"count"),e.get(this,"name"),e.get(this,"properties"),e.get(this,"type_attributes",function(){returnthis.get("type_attributes")}),e.get(this,"label",function(){vara=this.get("name");returnvoid0===a?"":a});vard=this;this.on("sync",function(a,b,d){c.trigger("nodetype:save",this,b,d)}),this.listenTo(this.attributes.properties,"change",function(){d.trigger("change:properties",d.attributes.properties)})},parse_label:function(){vara=this.label,b={};returnb.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")):a,b}}),j=g.extend({initialize:function(a,b){e.get(this,"name"),e.get(this,"count"),e.get(this,"type_attributes",function(){returnthis.get("type_attributes")}),e.get(this,"properties"),e.get(this,"label",function(){vara=this.get("name");returnvoid0===a?"":a}),this.on("sync",function(a,b,d){c.trigger("edgetype:save",this,b,d)})}}),l=c.Model.extend({idAttribute:"uuid",defaults:{uuid:"",nodetype:"",label:"",color:[0,0,0],coords:[0,0,0]},initialize:function(a,d){varf=this;e.get(this,"graph",function(){returnnull!=f.collection?f.collection.graph:null}),e.get(this,"type",function(){returnthis.nodetype}),e.get(this,"nodetype",function(){returnf.graph?f.graph.get_node_type(f.get("nodetype")):null}),e.get(this,"properties",function(){returnf.get("properties")}),this.properties||this.set("properties",newc.Model),e.get(this,"label",function(){vara=f.properties.get("label");returnvoid0===a?"":a}),e.get(this,"formatted_label",this.format_label),this.clusters={},e.getset(f,"color"),this.on("sync",function(a,b,d){c.trigger("node:save",f,b,d)}),this.on("change:cl_color",function(a){a.set("color",a.get("cl_color"))}),this.on("change",function(a){a._neighbors=null}),e.Flagable(this),b.bindAll(this,"degree","format_label","neighbors","strength")},getHexColor:function(){return0},format_label:function(a){varb=this.label;returna&&(b=b.substring(0,a)),[{form:b,css:".normal-font"}]},degree:function(a,b){returnthis.graph.degree(this,a,b)},strength:function(a,b){returnthis.graph.strength(this,a,b)},incident:function(a,b){returnthis.graph.incident(this,a,b)},neighbors:function(a,b){returnthis.graph.neighbors(this,a,b)}},{active_flags:[]}),m=c.Model.extend({idAttribute:"uuid",defaults:{},constructor:function(){c.Model.apply(this,arguments);vara=this;e.get(this,"graph",function(){returnnull!=a.collection?a.collection.graph:null}),e.get(this,"type",function(){returna.edgetype}),e.get(this,"edgetype",function(){returna.graph?a.graph.get_edge_type(a.get("edgetype")):null}),e.get(this,"source",function(){returna.graph?a.graph.vs.get(a.get("source")):null}),e.get(this,"target",function(){returna.graph?a.graph.vs.get(a.get("target")):null}),e.get(this,"weight",function(){returna.graph?a.properties.get("weight"):1}),e.get(this,"sym",this.sym),e.get(this,"properties",function(){returna.get("properties")}),e.get(this,"label",function(){varb=a.properties.get("label");returnnull!=b&&0!=b.length||!a.edgetype?b:a.edgetype.name}),this.properties||this.set("properties",newc.Model),e.Flagable(this),this.on("sync",function(a,b,d){c.trigger("edge:save",a,b,d)})},str:function(){vara=function(a,b){returnb+": "+a};return"("+this.get("s")+","+this.get("t")+") "+this.source.label+"-->"+this.target.label+","+b.map(this.attributes,a).join(", ")},tuple:function(){},sym:function(){returnb(this.collection.models).findWhere({source:this.target,target:this.source})},is_loop:function(){returnthis.source.id==this.target.id}},{active_flags:[]}),n=c.Collection.extend({model:l,initialize:function(a,b){_this=this,b&&(this.graph=b.graph)},copy_attr:function(a,c,d){b.map(this.graph.vs.select({}),function(b){b.set(c,b.get(a),d)})},select:function(a){returnthis.graph.select(a)}}),o=c.Collection.extend({model:m,initialize:function(a,b){this.graph=b.graph},between:function(a,b,c){if(a&&b)returnthis.models.filter(function(d){returnc?d.source==a&d.target==b:(d.source==a|d.source==b)&(d.target==a|d.target==b)})}}),p=c.Collection.extend({model:g,parse:function(a){return"nodetypes"ina?a.nodetypes:"edgetypes"ina?a.edgetypes:void0}});e.Graph=f,e.Type=g,e.Vertices=n,e.Vertex=l,e.Edges=o,e.Edge=m,e.EdgeType=j,e.NodeType=h,e.ClusterLabel=c.Model.extend({idAttribute:"id",defaults:{label:"",score:1,role:"*",size:12,clusters:null},initialize:function(){e.get(this,"label"),e.get(this,"role"),e.get(this,"score"),e.getset(this,"clusters"),this.clusters={},b.bindAll(this,"_format_label"),e.get(this,"formatted_label",this._format_label),e.Flagable(this)},_format_label:function(){return[{form:this.get("label"),css:"normal"}]}},{active_flags:[]}),e.Cluster=c.Model.extend({defaults:{members:{},labels:[],misc:!1,selected:!1,color:[200,200,200]},initialize:function(a,c){vard=this;b.bindAll(d,"_compute_membership","_compute_colors"),e.get(this,"members"),e.getset(this,"labels"),e.get(this,"misc"),e.getset(this,"color"),e.get(this,"selected",function(){returnd.has_flag("selected")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){d.collection.trigger("change:selected")}),e.Flagable(this)},is_misc:function(){returnthis.misc},select:function(a){a?this.collection.set_selected([this]):this.add_flag("selected")},toggle_select:function(a){varb=this.collection.selected.length;this.selected?a&&b>=2?this.collection.set_selected([this]):this.remove_flag("selected"):this.select(a)},some_selected:function(){returnthis.selected||this.collection.by_flag("selected")},_compute_membership:function(){vara=this,c=this.collection.clustering.cid;b(a.members).each(function(b){b.each(function(b){vard={cluster:a};b.clusters[c]?b.clusters[c].push(d):b.clusters[c]=[d],b.trigger("change:clusters"),b.trigger("change:clusters:"+c)})})},_compute_colors_old:function(){vara=this.collection.length,b=this.collection.clustering.get("color_value"),c=this.collection.clustering.get("color_saturation"),d=this.collection.indexOf(this),f=[99,99,99];this.misc===!1&&(f=e.utils.hsvToRgb(d/a*360|0,c,b)),this.color=f},_compute_colors:function(a){if(this.misc===!0)returnvoid(this.color=[99,99,99]);varc=(this.collection.length,this.collection.clustering.get("color_value")),d=this.collection.clustering.get("color_saturation"),f=(this.collection.indexOf(this),[0,0,0]),g=f,h=0,i={};this.members.vs.each(function(a){varb=a.get("cl_color");s_last_node_cl_color=b.toString(),i[s_last_node_cl_color]?i[s_last_node_cl_color]++:i[s_last_node_cl_color]=1,i[s_last_node_cl_color]>h&&(h=i[s_last_node_cl_color],g=b)}),cluster_color=g;for(varj=0;b.isEqual(cluster_color,f)|a.indexOf(cluster_color.toString())!=-1;)cluster_color=e.utils.hsvToRgb(1*j*222.23%360|0,d,c),j++;a.push(cluster_color.toString()),this.color=cluster_color}},{active_flags:["selected"]}),e.ClustersList=c.Collection.extend({model:e.Cluster,initialize:function(a,b){_this=this,e.get(this,"selected",function(){returnthis.by_flag("selected")}),e.assert(b.clustering,"options.clustering is needed"),this.clustering=b.clustering,this.on("add remove reset",function(){vara=[];this.each(function(b){b._compute_membership(),b._compute_colors(a)})}),this.listenTo(this.clustering,"change:color_saturation change:color_value",function(){vara=[];this.each(function(b){b._compute_colors(a)})})},some_selected:function(){returnthis.by_flag("selected").length>0},select:function(a,b){a.select(b),this.trigger("change:selected",a)},clear_selection:function(a){this.set_selected(null),a&&a.silent||this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")},has_misc:function(){vara=function(a){returna.is_misc()};returnb.some(this.models,a)},cluster:function(a){returnthis.at(a)}}),e.Clustering=c.Model.extend({defaults:{clusters:null,members:{},color_value:80,color_saturation:40},ClusterLabelModel:e.ClusterLabel,ClusterModel:e.Cluster,ClustersCollection:e.ClustersList,initialize:function(a,b){a=a||{},e.getset(this,"members"),e.getset(this,"clusters"),e.getset(this,"color_value"),e.getset(this,"color_saturation"),this.ClusterLabelModel=a.ClusterLabelModel||this.ClusterLabelModel,this.ClusterModel=a.ClusterModel||this.ClusterModel,this.ClustersCollection=a.ClustersCollection||this.ClustersCollection;varc={clustering:this,model:this.ClusterModel},d=newthis.ClustersCollection([],c);this.set("clusters",d),e.FlagableCollection(this.clusters)},reset:function(a,c){vard=this,e=b(a).clone();c&&c.members&&b.extend(this.members,c.members);varf=this.members;b.map(e.clusters,function(a){a.misc=!1}),e.misc>-1&&(e.clusters[e.misc].misc=!0),cluster_models=[],b.each(e.clusters,function(a){cluster_members={},b.each(f,function(c,d){source_clone=c.source.clone(),source_filtered=source_clone.filter(function(d){returnb(a[c.id_field]).contains(d.id)}),source_clone.reset(source_filtered,{silent:!0}),cluster_members[d]=source_clone}),cluster_models.push(newd.ClusterModel({members:cluster_members,misc:a.misc}))}),this.clusters.reset(cluster_models),this.trigger("reset")},set_labels:function(a,b){this.clusters.each(function(b,c){b.labels=a.labels[c]})}}),e.utils={},e.utils.asEvents=function(a){varb;return{on:function(c,d){if(b)thrownewError("this is one off wrapper");a.addEventListener(c,d,!1),b=[c,d]},off:function(){a.removeEventListener.apply(a,b)}}};varq=function(a){returna="0"+a.toString(16),a.substring(a.length-2)};returne.utils.css_color=function(a){varc="#000000";returna&&(c="#"+b.map(a,q).join("")),c},e.utils.css_gradient=function(a,b){return"-webkit-linear-gradient("+e.utils.css_color(a)+","+e.utils.css_color(b)+")"},e.utils.color_darker=function(a){varb=e.utils.rgbToHsv(a[0],a[1],a[2]);returne.utils.hsvToRgb(b[0],b[1],60)},e.utils.hsvToRgb=function(a,b,c){b/=100,c/=100;vard=Math.floor(a/60%6),e=a/60-d,f=c*(1-b),g=c*(1-e*b),h=c*(1-(1-e)*b),i=[];switch(d){case0:i=[c,h,f];break;case1:i=[g,c,f];break;case2:i=[f,c,h];break;case3:i=[f,g,c];break;case4:i=[h,f,c];break;case5:i=[c,f,g]}varj=Math.min(255,256*i[0]|0),k=Math.min(255,256*i[1]|0),l=Math.min(255,256*i[2]|0);return[j,k,l]},e.utils.rgbToHsv=function(a,b,c){vard,e,f=a/255,g=b/255,h=c/255,i=Math.min(Math.min(f,g),h),j=Math.max(Math.max(f,g),h),k=j;returnj==i?e=0:j==f?e=60*((g-h)/(j-i))%360:j==g?e=60*((h-f)/(j-i))+120:j==h&&(e=60*((f-g)/(j-i))+240),e<0&&(e+=360),d=0===j?0:1-i/j,[0|e,100*d|0,100*k|0]},e.utils.addCSSRule=function(a,b,c){for(vard,e,f=0;f<document.styleSheets.length;f++){d=document.styleSheets[f],e=d.cssRules||d.rules;for(varg=a.toLowerCase(),h=0,i=e.length;h<i;h++)if(e[h].selectorText&&e[h].selectorText.toLowerCase()==g){if(null!==c)returnvoid(e[h].style[b]=c);d.deleteRule?d.deleteRule(h):d.removeRule?d.removeRule(h):e[h].style.cssText=""}}d=document.styleSheets[0]||{},d.insertRule?(e=d.cssRules||d.rules,d.insertRule(a+"{ "+b+":"+c+"; }",e.length)):d.addRule&&d.addRule(a,b+":"+c+";",0)},e.utils.deparam=function(a,b){varc={},d={true:!0,false:!1,null:null};return$.each(a.replace(/\+/g," ").split("&"),function(a,e){varf,g=e.split("="),h=decodeURIComponent(g[0]),i=c,j=0,k=h.split("]["),l=k.length-1;if(/\[/.test(k[0])&&/\]$/.test(k[l])?(k[l]=k[l].replace(/\]$/,""),k=k.shift().split("[").concat(k),l=k.length-1):l=0,2===g.length)if(f=decodeURIComponent(g[1]),b&&(f=f&&!isNaN(f)?+f:"undefined"===f?void0:void0!==d[f]?d[f]:f),l)for(;j<=l;j++)h=""===k[j]?i.length:k[j],i=i[h]=j<l?i[h]||(k[j+1]&&isNaN(k[j+1])?{}:[]):f;else$.isArray(c[h])?c[h].push(f):void0!==c[h]?c[h]=[c[h],f]:c[h]=f;elseh&&(c[h]=b?void0:"")}),c},e.utils.piwikTrackCurrentUrl=function(){b.isUndefined(window._paq)||"function"!=typeofwindow._paq.push||(window._paq.push(["setCustomUrl",window.location.href]),window._paq.push(["trackPageView"]))},e});