integ/js/vs/_vs.token2.js
changeset 28 84719280c84d
child 53 88666afffe6b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/integ/js/vs/_vs.token2.js	Fri Apr 12 15:08:00 2013 +0200
@@ -0,0 +1,597 @@
+(function ($) {
+$.fn._vs.token = {
+
+    // alias for d3 color scale D3
+    colorRange:function(){},
+    
+    init:function(_this){
+      // Color scale import form d3 
+      // todo shape management
+      this.colorRange = _this.settings.chart.colorRange
+    },
+    ID:function(_this){
+      _this.settings.data.tokenPast+=1
+      return _this.settings.data.tokenPast
+    },
+    selectAll:function(_this,key,value){
+      // DRAFT VERSION writing select All ...... 
+      var result = []
+      var all    = false
+      result.flocculate  = function(){
+        var r=[]
+        result.forEach(function(i){
+          q = i.flocculate()
+          r.push(q)
+        })
+        return r
+      }
+      result.attr  = function(key,value,param){
+        var r=[]
+        result.forEach(function(i){
+          //console.log(key,value,param)
+          q = i.attr(key,value,param)
+          //console.log("q",q)
+          r.push(q)
+        })
+        return r
+      }
+      
+      result.b2dObj  = function(key,value,param){
+        var r=[]
+        result.forEach(function(i){
+          //console.log(key,value,param)
+          q = i.myobj
+          //console.log("q",q)
+          r.push(q)
+        })
+        return r
+      }
+
+      if(typeof(value) == "undefined" && typeof(key) == "undefined"){ 
+        all =true
+      }
+      
+      for (var i = _this.tokens.length - 1; i >= 0; i--) {
+        if(_this.tokens[i].attr(key) == value || all==true){
+          result.push(_this.tokens[i])
+       }
+      }
+        return result;
+    },
+
+    select:function(_this,key,value){
+      result = []
+      if(typeof(value) == "undefined" && typeof(key) == "undefined"){ 
+        return _this.tokens 
+      }else{
+        for (var i = _this.tokens.length - 1; i >= 0; i--) {
+          if(_this.tokens[i].attr(key) == value){
+            result.push(_this.tokens[i])
+            break;
+          }
+        }
+      }
+      if(typeof(result[0])=="undefined"){
+        return false
+      }else{
+        return result[0];
+      }
+    },
+
+
+    addToken:function (_this,element){
+     //default token setting  
+     var defaultTokenSetting ={
+        x:50,y:50, // positions
+        t:null,    // time 
+        category:1,// data category 
+        state:0,   // state 
+        /*
+         0 = Not Enter in the stage,
+         1 = suspension,
+         2 = floculation,
+         2 + n = _this.strata.list[n]
+        */
+
+        // Graphic Parameter
+        size:10,   fillStyle:'###',  strokeStyle:'rgba(0,0,0,0)', lineWidth:0, texture:undefined,
+        shape:{type:'round'}, // vertice, box, round, ?? svg path with json serialisation {}        
+        userdata:{},
+
+        // Interactions callbacks 
+        callback:{}, 
+        
+        // Physical parameters
+        phy:{ density:10,friction:0,restitution:0},
+        targets:[/*{x:null,y:null}*/],
+        elbow:{/*x:null,y:null*/}
+     }
+
+     var result = null;
+     var myobj = null
+     var token = function (){}
+
+     //console.log(element)
+     if(typeof(element)=='undefined'){
+        token.setting = defaultTokenSetting
+        token.setting.ID = this.ID(_this)
+     } else {
+        token.setting   = element
+        if(typeof(token.setting.phy)    =='undefined') {token.setting.phy    = defaultTokenSetting.phy}
+        if(typeof(token.setting.t)      =='undefined') {token.setting.t      = _this.settings.stream.now}
+        if(typeof(token.setting.x)      =='undefined') {token.setting.x      = _this.settings.sedimentation.incoming.point[element.category].x+(Math.random()*2)}
+        if(typeof(token.setting.y)      =='undefined') {token.setting.y      = _this.settings.sedimentation.incoming.point[element.category].y+(Math.random()*2)}
+        if(typeof(token.setting.size)   =='undefined') {token.setting.size   = _this.settings.sedimentation.token.size.original}
+        if(typeof(token.setting.targets)=='undefined') {token.setting.targets=[]}
+        token.setting.ID = token.setting.ID = this.ID(_this)
+        if(typeof(token.setting.state)  =='undefined') {token.setting.state  = 0}
+        if(typeof(token.setting.shape)  =='undefined') {token.setting.shape  = defaultTokenSetting.shape }
+      }
+
+      token.myobj =  this.create(_this,token.setting)
+      //console.log("token.myobj",token.myobj)
+
+          token.flocculate = function(){
+            _this.tokens.indexOf(this)
+            _this.flocculate.destroyIt(_this,this)
+           return this
+          }
+
+          token.attr = function(key,value,param){
+            //console.log("attr",this.myobj)
+            if(typeof(value) == "undefined"){
+              if(typeof(this[key])!="undefined"){
+               return this[key]()
+              }else{
+               return this.myobj.m_userData[key]
+              }
+            }else{
+             if(typeof(this[key])!="undefined"){
+              this[key](value,param)
+             }else{
+              this.myobj.m_userData[key]=value
+            }
+           }
+           return this
+          }
+
+          token.callback = function(value,param){
+            if (!arguments.length){return this.myobj.m_userData.callback}
+            if (typeof(this.myobj.m_userData.callback[value])=="function"){
+              return this.myobj.m_userData.callback[value](param)
+            } else {
+              return function(param){console.log("callback undefined")}
+            }
+          }
+          
+          token.size = function(value){
+            //console.log(this.attr('state'))
+            if(this.myobj!=null && this.attr('state')<2){
+              if (!arguments.length){return this.myobj.m_shape.m_radius*this.myobj.m_userData.scale;}
+                this.myobj.m_shape.m_radius = value/this.myobj.m_userData.scale
+            }
+          }
+          token.b2dObj = function(){
+              if(this.myobj!=null && this.attr('state')<2){
+                return this.myobj
+              }
+          }
+      
+          token.texture = function(value){
+            if (!arguments.length){return this.myobj.m_userData.texture.img.src;}
+             console.log("texture",value)
+             this.myobj.m_userData.texture={}
+             this.myobj.m_userData.texture.img = new Image();
+             this.myobj.m_userData.texture.img.src = value
+          }
+
+      //console.log("token",token)
+      _this.tokens.push(token)
+      _this.decay.tokens.push(token)
+
+      // Execute suspension callback 
+      if(typeof(this.myobj.m_userData.callback)!="undefined"){
+        if(typeof(this.myobj.m_userData.callback.suspension)=="function"){
+           var t = _this.select('ID',token.setting.ID)
+           this.myobj.m_userData.callback.suspension(t)         
+        }
+      }
+
+     return token
+    },
+
+    // CREATE IS A TRY TO UNIFY TOKEN PRODUCTION
+    create:function(_this,token) {
+      //targetX,targetY, x, y,size,family
+      //console.log("create",token)
+      token.scale = scale = _this.settings.options.scale
+
+      //console.log("DBT")
+      var xPos              = token.x/scale+(Math.random()*0.1);
+      var yPos              = token.y/scale+(Math.random()*0.1);
+
+      // CREATE BALL
+      var fixDef            = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density      = 0.1;
+        fixDef.friction     = 0.0;
+        fixDef.restitution  = 0.0;
+        //console.log(token)
+
+        // round
+        if(token.shape.type == "round"){
+          fixDef.shape      = new Box2D.Collision.Shapes.b2CircleShape(token.size/scale);
+        // or polygon
+        }else if(token.shape.type == "polygons"){
+          //fixDef.shape      = new Box2D.Collision.Shapes.b2PolygonShape;
+          fixDef            = this.setPolygons(_this,token,fixDef)
+        }else if(token.shape.type == "box"){
+          fixDef.shape      = new Box2D.Collision.Shapes.b2PolygonShape;
+          //console.log(fixDef)
+          fixDef.shape.SetAsBox(token.shape.width/scale,token.shape.height/scale)
+        }
+
+      var bodyDef           = new Box2D.Dynamics.b2BodyDef;
+        bodyDef.type        = Box2D.Dynamics.b2Body.b2_dynamicBody;
+        bodyDef.position.x  = token.x/scale;//+(Math.random())
+        bodyDef.position.y  = token.y/scale;
+      
+      this.myobj = _this.world.CreateBody(bodyDef).CreateFixture(fixDef)
+
+      if(typeof(token.texture)!="undefined"){
+        token.texture.img = new Image();
+        token.texture.img.src = token.texture.src
+      }
+      
+      if(typeof(token.impulse)!="undefined"){
+        this.applyImpulse(this.myobj,token.impulse.angle,token.impulse.power);
+      }
+
+      if(typeof(token.fillStyle) =="undefined"){   token.fillStyle  = this.colorRange(token.category) }
+      //if(typeof(token.stokeStyle)=="undefined"){   token.stokeStyle = "#000"}//"rgba(0,0,0,0.5)" }
+      if(typeof(token.lineWidth) =="undefined"){   token.lineWidth  = 0 }
+      if(typeof(token.type)  =="undefined"){       token.type="token"   }
+      if(typeof(token.callback)  =="undefined"){   
+        token.callback = {}
+                   // {
+                   //      suspension:undefined,
+                   //      flocculation:undefined,
+                   //      draw:undefined,
+                   //      mouseover:undefined,
+                   //      mouseout:undefined,
+                   //      click:undefined
+                   //    }
+      }
+
+      this.myobj.m_userData       = token 
+      this.myobj.attr             = this.attr// function (){console.log(this)} 
+      this.myobj.m_userData.mouse = {}
+      this.myobj.m_userData.mouse.over        = false;
+      this.myobj.m_userData.mouse.down        = false;
+      this.myobj.m_userData.mouse.dragging    = false;
+      this.myobj.m_userData.mouse.statebefore = false;
+      this.myobj.m_userData.state = 1;  // now in the world
+
+      if(token.targets.length==0 && _this.settings.chart.type=="CircleLayout"){
+        token.targets[0]={
+                         x: _this.settings.sedimentation.incoming.target[token.category].x,
+                         y: _this.settings.sedimentation.incoming.target[token.category].y
+                  }
+      }
+
+      if(token.targets.length>0){
+        //console.log()
+        //CREATE JOIN MOUVEMENT TO TARGET
+        var md              = new _this.phy.b2MouseJointDef();
+        md.bodyA            = _this.world.GetGroundBody();
+        md.bodyB            = this.myobj.GetBody();
+        md.target.Set(xPos,yPos);
+        md.collideConnected = true;
+        md.maxForce         = 50 * this.myobj.GetBody().GetMass();
+        mouseJoint          = _this.world.CreateJoint(md);
+        mouseJoint.SetTarget(new _this.phy.b2Vec2(token.targets[0].x/scale, token.targets[0].y/scale));
+      }
+
+      // ADD INFO IN OBJECT
+      //categorys[family].value+=1;
+      //setTimeout(function(){mouseJoint.SetTarget(chart.position.x/scale, chart.position.y/scale)},1000);
+      //categorys[family].joins.push(mouseJoint); 
+    
+      return this.myobj;
+    },
+
+    applyImpulse:function(bodyId, degrees, power) {
+    var body = bodyId.GetBody();
+    body.ApplyImpulse(new Box2D.Common.Math.b2Vec2(Math.cos(degrees * (Math.PI / 180)) * power,
+                                 Math.sin(degrees * (Math.PI / 180)) * power),
+                                 body.GetWorldCenter());
+    },
+    
+
+    setPolygons:function (_this,token,fixDef){
+
+      fixDef.shape    = new Box2D.Collision.Shapes.b2PolygonShape;
+
+      if(token.shape.points==null){
+         token.shape.points = [{x: -1, y: -1}, {x: 1, y: -1}, {x: -1, y:-1},{x: 1, y:-1}]
+      };
+    
+      for (var i = 0; i < token.shape.points.length; i++) {
+          var vec = new Box2D.Common.Math.b2Vec2();
+          vec.Set(token.shape.points[i].x/scale, token.shape.points[i].y/scale);
+          token.shape.points[i] = vec;
+      }  
+
+      fixDef.shape.SetAsArray(token.shape.points, token.shape.points.length);
+      return fixDef;    
+    },
+
+
+    createDataBarBall:function (_this, x, y,size,family) { 
+      //console.log(Math.round(family)) ;
+      var fixDef = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density = 10.0;
+        fixDef.friction = 0.5;
+        fixDef.restitution = 0.2;
+        fixDef.shape = new Box2D.Collision.Shapes.b2CircleShape(size/_this.settings.options.scale);
+    
+      var bodyDef = new Box2D.Dynamics.b2BodyDef;
+        bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody;
+        bodyDef.position.x = x/_this.settings.options.scale;//+(Math.random())
+        bodyDef.position.y = y/_this.settings.options.scale;
+    
+      var myobj = _this.world.CreateBody(bodyDef).CreateFixture(fixDef)
+      myobj.m_userData={type:"BarChartBall",
+                familyID:'family',
+                fillColor:this.colorRange(family)} //dynamiq
+      //console.log(myobj);
+      return myobj;
+    },
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    // ....................................................................
+    // OLD OLD OLD  Physicals elements 
+    // !!!!!!!!!!!!!!!!!!   Have to clean 
+    // ....................................................................
+
+    // !!!!!!!!!! To mix withe the one in piechart and bar chart ::: createBox
+    createBox:function (world, x, y, width, height, angle, fillColor, fixed) {
+      if (typeof(fixed) == 'undefined') fixed = true;
+       var fixDef       = new b2FixtureDef;
+      if (!fixed) fixDef.density = 100.0;
+       fixDef.friction    = 0.6;
+       fixDef.restitution   = 0.3;
+       
+       var bodyDef      = new b2BodyDef;
+       bodyDef.type     = b2Body.b2_staticBody;
+       bodyDef.angle    = angle ;//* b2Settings.b2_pi; 
+       fixDef.shape     = new b2PolygonShape;
+       fixDef.shape.SetAsBox(width/scale, height/scale);
+       bodyDef.position.Set(x/scale, y/scale);
+       var myobj        = world.CreateBody(bodyDef).CreateFixture(fixDef)
+       myobj.m_userData   = {type:"Wall",fillColor:fillColor}
+       console.log(myobj.m_userData)
+       return myobj;
+       
+    },
+    createBoxPie:function (world,axis, x, y, width, height, angle, fillColor) {
+      var bodyDef     = new b2BodyDef;
+        bodyDef.type    = Box2D.Dynamics.b2Body.b2_dynamicBody;
+      var fixDef      = new Box2D.Dynamics.b2FixtureDef;
+      fixDef.shape    = new b2PolygonShape;
+      fixDef.shape.SetAsBox(width/scale, height/scale);
+        fixDef.density      = 1000000.0;
+        fixDef.friction     = 0.5;
+        fixDef.restitution  = 0.2;
+        bodyDef.position.Set(x/scale, y/scale);
+      bodyDef.angle     = 0;
+      var myobj       = world.CreateBody(bodyDef).CreateFixture(fixDef);
+      myobj.m_userData  = {type:"Wall",fillColor:fillColor}
+    
+       return myobj;
+       
+    },
+    createBox0D:function (world, x, y, width, height, fixed) {
+      if (typeof(fixed) == 'undefined') fixed = true;
+      var boxSd = new b2BoxDef();
+      boxSd.restitution = -0.6;
+      boxSd.friction = .3;
+      if (!fixed) boxSd.density = 0.01;
+      boxSd.extents.Set(width, height);
+      var boxBd = new b2BodyDef();
+      boxBd.AddShape(boxSd);
+      boxBd.position.Set(x,y);
+      return world.CreateBody(boxBd)
+    },
+    createHiddenBox:function (world, x, y, width, height, fixed) {
+      if (typeof(fixed) == 'undefined') fixed = true;
+      var boxSd = new b2BoxDef();
+      boxSd.restitution = 0.6;
+      boxSd.friction = .3;
+      if (!fixed) boxSd.density = 1.0;
+      boxSd.extents.Set(width, height);
+      var boxBd = new b2BodyDef();
+      boxBd.AddShape(boxSd);
+      boxBd.position.Set(x,y);
+      var myObject = world.CreateBody(boxBd)
+      myObject.m_shapeList.visibility = 'hidden'; 
+      console.log(myObject);
+      return myObject
+      
+    },
+    createBigBall:function (world, x, y) { 
+      var fixDef           = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density     = 1000000.0;
+        fixDef.friction    = 0.5;
+        fixDef.restitution = 0.2;
+        fixDef.shape       = new Box2D.Collision.Shapes.b2CircleShape(20/30);
+    
+        var bodyDef      = new Box2D.Dynamics.b2BodyDef;
+      bodyDef.type     = Box2D.Dynamics.b2Body.b2_dynamicBody;
+        bodyDef.position.x = x;
+        bodyDef.position.y = y;
+      var myobj = world.CreateBody(bodyDef).CreateFixture(fixDef)
+      //console.log(myobj)
+      return myobj;
+    },
+    
+    /*
+    286
+        Create standard boxes of given height , width at x,y
+    287
+    */
+    
+    createPieBox:function (world, x, y, width, height,rotation,color, options){
+    
+      //default setting
+    
+     options = $.extend(true, {
+         'density':10000000.0 ,
+         'friction':1.0 ,
+         'restitution':0.2 ,
+         'linearDamping':0.0 ,
+         'angularDamping':0.0 ,
+         'gravityScale':0.0 ,
+         'type':b2Body.b2_dynamicBody
+     }, options);
+    
+    
+     var body_def       = new b2BodyDef();
+     var fix_def      = new b2FixtureDef;
+     fix_def.density    = options.density;
+     fix_def.friction     = options.friction;
+     fix_def.restitution  = options.restitution;
+     fix_def.shape      = new b2PolygonShape();
+     fix_def.shape.SetAsBox( width/scale , height/scale );
+     body_def.position.Set(x/scale , y/scale);
+     body_def.linearDamping = options.linearDamping;
+     body_def.angularDamping = options.angularDamping;
+     body_def.angle     = rotation;
+    
+     body_def.type      = options.type;
+     var b          = world.CreateBody( body_def );
+     var f          = b.CreateFixture(fix_def);
+     f.m_userData     = {type:"box",familyID:null,fillColor:color}
+    
+     return b;
+    
+    },
+
+    createDataBallTarget:function (world,targetX,targetY, x, y,size,family) {
+      //console.log("DBT")
+      var xPos              = x/scale+(Math.random()*0.1);
+      var yPos              = y/scale+(Math.random()*0.1);
+
+      // CREATE BALL
+      var fixDef            = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density      = 0.1;
+        fixDef.friction     = 0.0;
+        fixDef.restitution  = 0.0;
+        fixDef.shape        = new Box2D.Collision.Shapes.b2CircleShape(size/scale);
+        var bodyDef         = new Box2D.Dynamics.b2BodyDef;
+      bodyDef.type          = Box2D.Dynamics.b2Body.b2_dynamicBody;
+        bodyDef.position.x  = xPos;
+        bodyDef.position.y  = yPos;
+        var myobj           = world.CreateBody(bodyDef).CreateFixture(fixDef);
+      
+      //CREATE JOIN MOUVEMENT TO TARGET
+      var md                = new b2MouseJointDef();
+        md.bodyA            = world.GetGroundBody();
+        md.bodyB            = myobj.GetBody();
+        md.target.Set(xPos,yPos);
+        md.collideConnected = true;
+        md.maxForce         = 50* myobj.GetBody().GetMass();
+        mouseJoint          = world.CreateJoint(md);
+      mouseJoint.SetTarget(new b2Vec2(targetX/scale, targetY/scale));
+    
+      // ADD INFO IN OBJECT
+      myobj.m_userData  = {type:"PieBall",familyID:family,fillColor:colorScale(family)}
+      categorys[family].value+=1;
+      //setTimeout(function(){mouseJoint.SetTarget(chart.position.x/scale, chart.position.y/scale)},1000);
+      categorys[family].joins.push(mouseJoint); 
+    
+      return myobj;
+    },
+    
+    createDataBallPie:function (world,target, x, y,size,family) {
+      console.log(target)
+      var xPos = categorys[family].incomingPoint.x/scale+(Math.random()*2/scale);
+      var yPos = categorys[family].incomingPoint.y/scale;
+    
+      // CREATE BALL
+      var fixDef           = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density     = 0.1;
+        fixDef.friction    = 0.0;
+        fixDef.restitution = 0.0;
+        fixDef.shape       = new Box2D.Collision.Shapes.b2CircleShape(size/scale);
+    
+        var bodyDef = new Box2D.Dynamics.b2BodyDef;
+      bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody;
+    
+        bodyDef.position.x = xPos;
+        bodyDef.position.y = yPos;
+    
+      // I need a distinct list with bodies (and not fixtures)
+      var myo = world.CreateBody(bodyDef);
+        myo.m_userData={type:"PieBall",familyID:family,fillColor:categorys[family].color}
+        
+        listBodies.push(myo);
+      var myobj = myo.CreateFixture(fixDef);
+      
+      //CREATE JOIN MOUVEMENT TO TARGET
+      var md = new b2MouseJointDef();
+        md.bodyA = world.GetGroundBody();
+        md.bodyB = myobj.GetBody();
+        md.target.Set(xPos,yPos);
+    
+        md.collideConnected = true;
+        md.maxForce = 100* myobj.GetBody().GetMass();
+        mouseJoint = world.CreateJoint(md);
+      mouseJoint.SetTarget(new b2Vec2(target.position.x/scale, target.position.y/scale));
+      
+      // ADD INFO IN OBJECT
+      myobj.m_userData={type:"PieBall",familyID:family,fillColor:colorScale(family)}
+      categorys[family].value+=1;
+      //setTimeout(function(){mouseJoint.SetTarget(chart.position.x/scale, chart.position.y/scale)},1000);
+    
+      return myobj;
+    },
+    
+    createDataBall:function (_this, x, y,size) { 
+      var fixDef      = new Box2D.Dynamics.b2FixtureDef;
+        fixDef.density    = 1.0;
+        fixDef.friction   = 0.5;
+        fixDef.restitution  = 0.2;
+        fixDef.shape    = new Box2D.Collision.Shapes.b2CircleShape(size/_this.settings.options.scale);
+    
+      var bodyDef = new Box2D.Dynamics.b2BodyDef;
+      bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody;
+        bodyDef.position.x = x;//+(Math.random())
+        bodyDef.position.y = y;
+    
+      var myobj = _this.world.CreateBody(bodyDef).CreateFixture(fixDef)
+      myobj.m_userData={type:"PieBall",
+                familyID:'family',// add family ///
+                fillColor:"rgb(200,0,0)"}// add color 
+    
+      //console.log(myobj)
+      return myobj;
+    },
+
+}
+
+})(jQuery);