social_cheesecake 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/app/assets/javascripts/kinetic.js +812 -432
  2. data/app/assets/javascripts/socialcheesecake/_header.js +1 -1
  3. data/app/assets/javascripts/socialcheesecake/actor.js +57 -32
  4. data/app/assets/javascripts/socialcheesecake/cheesecake.js +257 -280
  5. data/app/assets/javascripts/socialcheesecake/grid.js +168 -56
  6. data/app/assets/javascripts/socialcheesecake/sector.js +124 -70
  7. data/app/assets/javascripts/socialcheesecake/text.js +9 -4
  8. data/lib/social_cheesecake/version.rb +1 -1
  9. data/test/dummy/app/assets/images/images/ui-bg_diagonals-medium_20_d34d17_40x40.png +0 -0
  10. data/test/dummy/app/assets/images/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
  11. data/test/dummy/app/assets/images/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
  12. data/test/dummy/app/assets/images/images/ui-bg_gloss-wave_45_817865_500x100.png +0 -0
  13. data/test/dummy/app/assets/images/images/ui-bg_gloss-wave_60_fece2f_500x100.png +0 -0
  14. data/test/dummy/app/assets/images/images/ui-bg_gloss-wave_70_ffdd57_500x100.png +0 -0
  15. data/test/dummy/app/assets/images/images/ui-bg_gloss-wave_90_fff9e5_500x100.png +0 -0
  16. data/test/dummy/app/assets/images/images/ui-bg_highlight-soft_100_feeebd_1x100.png +0 -0
  17. data/test/dummy/app/assets/images/images/ui-bg_inset-soft_30_ffffff_1x100.png +0 -0
  18. data/test/dummy/app/assets/images/images/ui-icons_3d3d3d_256x240.png +0 -0
  19. data/test/dummy/app/assets/images/images/ui-icons_bd7b00_256x240.png +0 -0
  20. data/test/dummy/app/assets/images/images/ui-icons_d19405_256x240.png +0 -0
  21. data/test/dummy/app/assets/images/images/ui-icons_eb990f_256x240.png +0 -0
  22. data/test/dummy/app/assets/images/images/ui-icons_ed9f26_256x240.png +0 -0
  23. data/test/dummy/app/assets/images/images/ui-icons_fadc7a_256x240.png +0 -0
  24. data/test/dummy/app/assets/images/images/ui-icons_ffe180_256x240.png +0 -0
  25. data/test/dummy/app/assets/images/socialcheesecake_background.png +0 -0
  26. data/test/dummy/app/assets/images/soialcheesecake_icon.png +0 -0
  27. data/test/dummy/app/assets/images/soialcheesecake_icon_back.png +0 -0
  28. data/test/dummy/app/assets/images/under-construction.png +0 -0
  29. data/test/dummy/app/assets/javascripts/application.js +1 -0
  30. data/test/dummy/app/assets/javascripts/main.js +352 -0
  31. data/test/dummy/app/assets/stylesheets/jquery-ui-1.8.17.custom.css +565 -0
  32. data/test/dummy/app/assets/stylesheets/style.css +251 -0
  33. data/test/dummy/public/index.html +149 -119
  34. data/test/dummy/vendor/assets/javascripts/jquery-ui.js +356 -0
  35. metadata +29 -4
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license SocialCheesecake JavaScript Library v0.2.0
2
+ * @license SocialCheesecake JavaScript Library v0.3.0
3
3
  * https://github.com/adiezbal/SocialCheesecake
4
4
  * Developed by Alicia Díez (https://github.com/adiezbal)
5
5
  * Copyright 2011, Technical University of Madrid (Universidad Politécnica de Madrid)
@@ -12,10 +12,11 @@ var socialCheesecake = socialCheesecake || {};
12
12
  }
13
13
  this.id = settings.id;
14
14
  this.name = settings.name;
15
+ this.extraInfo = (settings.extraInfo) ? settings.extraInfo : undefined;
15
16
  this.opacity = 1;
16
17
  this._focused = false;
17
18
  this._selected = false;
18
- this._hidden = false;
19
+ this._hidden = true;
19
20
  this._filtered = false;
20
21
  this.fading = "none";
21
22
  this.parents = [];
@@ -23,50 +24,69 @@ var socialCheesecake = socialCheesecake || {};
23
24
 
24
25
  var actor = this;
25
26
  var actor_div = actor.getDiv();
26
- var mouseoverCallback = function(){
27
+
28
+ actor_div.addEventListener("mouseover", function(){
27
29
  var sector;
28
- actor.focus();
30
+ if( !actor.isSelected() ){
31
+ actor.focus();
32
+ }
29
33
  for (var subsector in actor.parents){
30
34
  sector = actor.parents[subsector].parent;
31
35
  sector.focus();
32
36
  sector.changeColor(sector.mouseover.color);
33
37
  actor.parents[subsector].changeColor(actor.parents[subsector].mouseover.color);
34
38
  }
35
- }
36
- var mouseoutCallback = function(){
39
+ }, false);
40
+ actor_div.addEventListener("mouseout", function(){
37
41
  var sector;
38
- actor.unfocus();
42
+ if( !actor.isSelected() ){
43
+ actor.unfocus();
44
+ }
39
45
  for (var subsector in actor.parents){
40
46
  sector = actor.parents[subsector].parent;
41
47
  sector.unfocus();
42
48
  sector.changeColor(sector.mouseout.color);
43
49
  actor.parents[subsector].changeColor(sector.mouseout.color);
44
50
  }
45
- }
46
- actor_div.addEventListener("mouseover", mouseoverCallback, false);
47
- actor_div.addEventListener("mouseout", mouseoutCallback, false);
51
+ }, false);
48
52
  actor_div.addEventListener("mousedown", function(){
49
53
  var sector;
50
54
  if( actor.isSelected()){
51
55
  // Deactivate actor
52
- actor._selected = false;
53
- actor.unfocus();
54
- actor_div.addEventListener("mouseover", mouseoverCallback, false);
55
- actor_div.addEventListener("mouseout", mouseoutCallback, false);
56
+ actor.unselect();
56
57
  }else{
57
58
  //Activate actor
58
- actor._selected = true;
59
- actor.focus();
60
- actor_div.removeEventListener("mouseover", mouseoverCallback, false);
61
- actor_div.removeEventListener("mouseout", mouseoutCallback, false);
59
+ actor.select();
62
60
  }
63
- });
61
+ }, false);
62
+ }
63
+
64
+ socialCheesecake.Actor.prototype.getParentsIds = function() {
65
+ var parents = this.parents;
66
+ var parentsIds = [];
67
+
68
+ for(var i in parents){
69
+ parentsIds.push(parents[i].id);
70
+ }
71
+ return parentsIds;
64
72
  }
65
73
 
66
74
  socialCheesecake.Actor.prototype.isSelected = function() {
67
75
  return this._selected;
68
76
  }
69
77
 
78
+ socialCheesecake.Actor.prototype.select = function() {
79
+ var actor = this;
80
+ actor._selected = true;
81
+ actor.focus();
82
+ }
83
+
84
+ socialCheesecake.Actor.prototype.unselect = function() {
85
+ var actor = this;
86
+ actor._selected = false;
87
+ actor.unfocus();
88
+ }
89
+
70
90
  socialCheesecake.Actor.prototype.focus = function() {
71
91
  var actor_div = this.getDiv();
72
92
  var newClass="";
@@ -109,18 +129,24 @@ var socialCheesecake = socialCheesecake || {};
109
129
  }
110
130
  }
111
131
  actor_div.setAttribute("style", newStyle);
112
- this.setDivOpacity(0);
113
132
  this.fading= "none";
114
133
  }
115
134
 
116
135
  socialCheesecake.Actor.prototype.show = function() {
117
- if(this.isFiltered()) return;
118
136
  var actor_div = this.getDiv();
137
+ var newStyle=" display: inline;";
138
+
139
+ if(this.isFiltered()) return;
140
+
119
141
  this._hidden = false;
120
142
  if (actor_div.getAttribute("style")){
121
- var newStyle = actor_div.getAttribute("style").replace(/display\s*:\s*none;/, "");
122
- actor_div.setAttribute("style", newStyle);
143
+ if (actor_div.getAttribute("style").match(/display\s*:\s*[a-z]*;/)){
144
+ newStyle = actor_div.getAttribute("style").replace(/display\s*:\s*[a-z]*;/, "display: inline;");
145
+ }else{
146
+ newStyle = actor_div.getAttribute("style").concat("display: inline;");
147
+ }
123
148
  }
149
+ actor_div.setAttribute("style", newStyle);
124
150
  }
125
151
 
126
152
  socialCheesecake.Actor.prototype.isHidden = function() {
@@ -162,22 +188,18 @@ var socialCheesecake = socialCheesecake || {};
162
188
 
163
189
  socialCheesecake.Actor.prototype.fade = function(time, modifyDisplay) {
164
190
  var actor = this;
191
+ var time = (time) ? time : 300;
165
192
  var deltaOpacity = 1000.0/ (60.0 *time);
166
193
  var grow = 0;
167
194
 
168
- //console.log(">Fade actor "+ actor.id+" now with opacity "+ x);
169
- //console.log(" >Fading value "+ this.fading);
170
-
171
195
  if (this.fading == "out"){
172
196
  grow = -1;
173
197
  }else if (this.fading == "in"){
174
198
  grow = 1;
175
- if (modifyDisplay) actor.show();
176
199
  }
177
200
  var opacity = this.opacity + grow * deltaOpacity;
178
201
  opacity = Math.round(opacity*1000)/1000;
179
202
  actor.setDivOpacity(opacity);
180
- var x = actor.opacity;
181
203
 
182
204
  if (((this.fading == "out") && (opacity >= 0))||
183
205
  ((this.fading == "in") && (opacity <= 1))){
@@ -185,8 +207,6 @@ var socialCheesecake = socialCheesecake || {};
185
207
  actor.fade(time, modifyDisplay);
186
208
  });
187
209
  }else{
188
- //console.log("STOP FADING Actor "+ actor.id + " now with opacity "+x);
189
- //console.log(" >Fading value "+ this.fading);
190
210
  this.fading = "none";
191
211
  if((modifyDisplay) && (opacity <= 0)) actor.hide();
192
212
  }
@@ -194,13 +214,18 @@ var socialCheesecake = socialCheesecake || {};
194
214
 
195
215
  socialCheesecake.Actor.prototype.fadeOut = function(time, modifyDisplay) {
196
216
  this.fading = "out";
217
+ this.setDivOpacity(1);
197
218
  this.fade(time, modifyDisplay);
198
219
  }
199
220
 
200
221
  socialCheesecake.Actor.prototype.fadeIn = function(time, modifyDisplay) {
201
- if(this.isFiltered()) return;
202
- this.fading = "in";
203
- this.fade(time, modifyDisplay);
222
+ var actor = this;
223
+
224
+ if(actor.isFiltered()) return;
225
+ actor.fading = "in";
226
+ actor.setDivOpacity(0);
227
+ if (modifyDisplay) actor.show();
228
+ actor.fade(time, modifyDisplay);
204
229
  }
205
230
 
206
231
  socialCheesecake.Actor.prototype.getCheesecake = function (){
@@ -1,23 +1,33 @@
1
1
  var socialCheesecake = socialCheesecake || {};
2
2
  (function() {
3
- //General variable settings (with dafault values)
4
- /* Normal */
5
- var sectorFillColor = "#eeffee"; //normal, mouseout, mouseup states
6
- var sectorFocusColor = "#77ff77"; //mousedown state
7
- var sectorHoverColor = "#aaffaa"; //mouseover state
8
- var sectorTextAndStrokeColor = "#1F4A75"; //text and border color
9
3
 
10
- /* Extra */
11
- var extraSectorFillColor = "#D4E4EA"; //normal, mouseout, mouseup states for extra sectors
12
- var extraFocusColor = "#1FA0F7"; //mousedown state for extra sectors
13
- var extraHoverColor = "#1FA0F7"; //mouseover state for extra sectors
14
- var extraTextAndStrokeColor = "#1F4A75"; //text and border color for extra sectors
4
+ //General variable settings (with default values)
5
+ socialCheesecake.colors = {
6
+ normalSector : {
7
+ background : "#eeffee", //normal, mouseout, mouseup states
8
+ highlight : "#77ff77", //mousedown state
9
+ hover : "#aaffaa", //mouseover state
10
+ font : "#1F4A75", //text
11
+ border : "#1F4A75" //stroke
12
+ },
13
+ extraSector : {
14
+ background : "#e5e5e5",
15
+ highlight : "#1FA0F7",
16
+ hover : "#D4E4EA",
17
+ font : "#1F4A75",
18
+ border : "#1F4A75"
19
+ },
20
+ greySector : {
21
+ background : "#f5f5f5",
22
+ highlight : "#f5f5f5",
23
+ hover : "#f5f5f5",
24
+ font : "#666",
25
+ border : "#666"
26
+ }
27
+ }
15
28
 
16
- /* Grey */
17
- var greySectorFillColor = "#f5f5f5"; //normal, mouseout, mouseup states for grey auxiliar sectors
18
- var greyFocusColor = "#f5f5f5"; //mousedown state for grey auxiliar sectors
19
- var greyHoverColor = "#f5f5f5"; //mouseover state for grey auxiliar sectors
20
- var greyTextAndStrokeColor = "#666"; //text and border color for grey auxilar sectors
29
+ /* Number of actors to animate */
30
+ var maxVisibleActors = 30;
21
31
 
22
32
  socialCheesecake.Cheesecake = function(cheesecakeData) {
23
33
  var jsonSectors = cheesecakeData.sectors;
@@ -34,6 +44,8 @@ var socialCheesecake = socialCheesecake || {};
34
44
  cheesecake.auxiliarSectors = [];
35
45
  cheesecake.stage = new Kinetic.Stage(cheesecakeData.container.id,
36
46
  cheesecakeData.container.width, cheesecakeData.container.height);
47
+ cheesecake.stage.add(new Kinetic.Layer());
48
+ cheesecake.stage.mainLayer = cheesecake.stage.layers[0];
37
49
  cheesecake.grid = new socialCheesecake.Grid({
38
50
  parent : this,
39
51
  grid_id : cheesecakeData.grid.id,
@@ -42,107 +54,158 @@ var socialCheesecake = socialCheesecake || {};
42
54
  cheesecake.searchEngine = new socialCheesecake.SearchEngine({
43
55
  parent : this
44
56
  });
45
- cheesecake.matchActorsNumber = cheesecakeData.match || true;
46
- cheesecake.changes = {};
47
-
48
- var extraSector = new socialCheesecake.Sector({
49
- parent : cheesecake,
50
- center : {
51
- x : cheesecakeData.center.x,
52
- y : cheesecakeData.center.y
53
- },
54
- label: "+",
55
- rOut : cheesecakeData.rMax,
56
- color : socialCheesecake.Cheesecake.getExtraSectorFillColor(),
57
- mouseover : {
58
- color : socialCheesecake.Cheesecake.getExtraSectorHoverColor(),
59
- callback : function(sector) {
60
- sector.focus();
61
- }
62
- },
63
- mouseout : {
64
- color : socialCheesecake.Cheesecake.getExtraSectorFillColor(),
65
- callback : function(sector) {
66
- sector.unfocus();
57
+ cheesecake.matchActorsNumber = cheesecakeData.match;
58
+ if(cheesecake.matchActorsNumber==null) cheesecake.matchActorsNumber = true;
59
+ cheesecake._initialState = {};
60
+ cheesecake._changes = {};
61
+ cheesecake.onChange = function(cheesecake){};
62
+ if(cheesecakeData.maxVisibleActors != undefined)
63
+ socialCheesecake.Cheesecake.setMaxVisibleActors(cheesecakeData.maxVisibleActors);
64
+ if(cheesecakeData.onChange)
65
+ cheesecake.onChange = cheesecakeData.onChange;
66
+ //Text settings
67
+ if(cheesecakeData.text){
68
+ for( var style in cheesecakeData.text){
69
+ socialCheesecake.text[style]= cheesecakeData.text[style];
70
+ }
71
+ }
72
+ //Color settings
73
+ if(cheesecakeData.colors){
74
+ for( var type in cheesecakeData.colors){
75
+ for (var color in cheesecakeData.colors[type]){
76
+ socialCheesecake.colors[type][color]= cheesecakeData.colors[type][color];
67
77
  }
68
- },
69
- mouseup : {color : socialCheesecake.Cheesecake.getExtraSectorFillColor()},
70
- mousedown : {color : socialCheesecake.Cheesecake.getExtraSectorFocusColor()},
71
- auxiliar : true,
72
- textAndStrokeColor : socialCheesecake.Cheesecake.getExtraSectorTextAndStrokeColor()
73
- });
74
- cheesecake.sectors[jsonSectors.length] = extraSector;
78
+ }
79
+ }
75
80
 
76
- for(var i = 0; i < jsonSectors.length; i++) {
81
+ if(jsonSectors.length < 16){
82
+ var extraSector = new socialCheesecake.Sector({
83
+ parent : cheesecake,
84
+ center : {
85
+ x : cheesecakeData.center.x,
86
+ y : cheesecakeData.center.y
87
+ },
88
+ label: "+",
89
+ rOut : cheesecakeData.rMax,
90
+ color : socialCheesecake.colors.extraSector.background,
91
+ mouseover : {
92
+ color : socialCheesecake.colors.extraSector.hover,
93
+ callback : function(sector) {
94
+ sector.focus();
95
+ cheesecake.grid.hideAll();
96
+ }
97
+ },
98
+ mouseout : {
99
+ color : socialCheesecake.colors.extraSector.background,
100
+ callback : function(sector) {
101
+ sector.unfocus();
102
+ cheesecake.grid.fadeInAll(300, true);
103
+ }
104
+ },
105
+ mouseup : {color : socialCheesecake.colors.extraSector.background},
106
+ mousedown : {
107
+ color : socialCheesecake.colors.extraSector.highlight
108
+ /*callback : function(sector){
109
+ cheesecake.focusAndBlurCheesecake(sector);
110
+ }*/
111
+ },
112
+ subsectors : [{
113
+ name : "New Subsector 1"
114
+ }],
115
+ auxiliar : true,
116
+ fontColor : socialCheesecake.colors.extraSector.font,
117
+ borderColor : socialCheesecake.colors.extraSector.border
118
+ });
119
+ cheesecake.sectors[jsonSectors.length] = extraSector;
120
+ }
121
+ var minNumSectors = Math.min(jsonSectors.length, 16);
122
+ for(var i = 0; i < minNumSectors; i++) {
77
123
  var settings = {
78
124
  parent : cheesecake,
79
125
  center : {
80
126
  x : cheesecakeData.center.x,
81
127
  y : cheesecakeData.center.y
82
128
  },
129
+ id : jsonSectors[i].id,
83
130
  label : jsonSectors[i].name,
84
131
  rOut : cheesecakeData.rMax,
85
132
  subsectors : jsonSectors[i].subsectors,
86
133
  mouseover : {
87
- color : socialCheesecake.Cheesecake.getSectorHoverColor(),
134
+ color : socialCheesecake.colors.normalSector.hover,
88
135
  callback : function(sector) {
89
- /* FIX FOR EXECUTING MOUSEOUT BEFORE MOUSEOVER */
90
- for(var i in cheesecake.sectors){
91
- cheesecake.sectors[i].getRegion().removeEventListener("mouseout");
92
- if(cheesecake.sectors[i]!= sector){
93
- cheesecake.sectors[i].unfocus();
94
- cheesecake.sectors[i].changeColor(cheesecake.sectors[i].mouseout.color);
95
- }
96
- }
97
- sector.getRegion().addEventListener("mouseout", function() {
98
- sector.eventHandler('mouseout');
99
- });
100
- /* END of FIX */
101
136
  document.body.style.cursor = "pointer";
102
137
  cheesecake.grid.hideAll();
103
138
  cheesecake.grid.fadeIn(sector.actors, 300, true);
104
139
  sector.focus();
140
+ if(cheesecake.highlightedSector != null){
141
+ cheesecake.highlightedSector.fan(false,
142
+ function(){
143
+ sector.fan(true);
144
+ }
145
+ );
146
+ }else{
147
+ sector.fan(true);
148
+ }
105
149
  sector.getCheesecake().setHighlightedSector(sector);
106
- //sector.getCheesecake().fanInSector(sector, true);
107
150
  }
108
151
  },
109
152
  mouseout : {
110
- color : socialCheesecake.Cheesecake.getSectorFillColor(),
153
+ color : socialCheesecake.colors.normalSector.background,
111
154
  callback : function(sector) {
112
155
  document.body.style.cursor = "default";
156
+ cheesecake.grid.hide(sector.actors);
113
157
  cheesecake.grid.fadeInAll(300, true);
114
158
  sector.unfocus();
115
159
  sector.getCheesecake().setHighlightedSector(null);
116
- //sector.getCheesecake().fanInSector(sector, false);
160
+ sector.fan(false);
117
161
  }
118
162
  },
119
163
  mousedown : {
120
- color : socialCheesecake.Cheesecake.getSectorFocusColor(),
164
+ color : socialCheesecake.colors.normalSector.highlight,
121
165
  callback : function(sector) {
122
166
  cheesecake.focusAndBlurCheesecake(sector);
123
167
  cheesecake.grid.hideAll();
124
168
  cheesecake.grid.fadeIn(sector.actors,300, true);
125
169
  }
126
170
  },
127
- mouseup : { color : socialCheesecake.Cheesecake.getSectorFillColor() },
128
- textAndStrokeColor : socialCheesecake.Cheesecake.getSectorTextAndStrokeColor()
171
+ mouseup : { color : socialCheesecake.colors.normalSector.background },
172
+ fontColor : socialCheesecake.colors.normalSector.font,
173
+ borderColor : socialCheesecake.colors.normalSector.border
129
174
  };
130
175
  cheesecake.sectors[i] = new socialCheesecake.Sector(settings);
131
176
  }
132
177
  cheesecake.calculatePortions();
178
+ cheesecake._setInitialState();
133
179
  cheesecake.draw();
134
180
  }
135
181
 
136
182
  socialCheesecake.Cheesecake.prototype.draw = function(){
137
183
  var sectors = this.sectors;
184
+ var mainLayer = this.stage.mainLayer;
138
185
  for (var sector in sectors){
139
- this.stage.add(sectors[sector].getRegion());
186
+ mainLayer.add(sectors[sector].getRegion());
187
+ }
188
+ this.stage.draw();
189
+ }
190
+
191
+ socialCheesecake.Cheesecake.prototype.disable = function(){
192
+ var layers = this.stage.layers;
193
+ for(var layer in layers){
194
+ layers[layer].listen(false);
195
+ }
196
+ }
197
+
198
+ socialCheesecake.Cheesecake.prototype.enable = function(){
199
+ var layers = this.stage.layers;
200
+ for(var layer in layers){
201
+ layers[layer].listen(true);
140
202
  }
141
203
  }
142
204
 
143
205
  socialCheesecake.Cheesecake.prototype.focusAndBlurCheesecake = function(sector) {
144
206
  var cheesecake = this;
145
- var regions = cheesecake.stage.getShapes();
207
+ var mainLayer = this.stage.mainLayer;
208
+ var regions = mainLayer.getShapes();
146
209
  var sectorIndex;
147
210
  for(var i in cheesecake.sectors) {
148
211
  if(cheesecake.sectors[i] === sector) sectorIndex = i;
@@ -151,9 +214,10 @@ var socialCheesecake = socialCheesecake || {};
151
214
  throw "sector doesn't belong to this cheesecake"
152
215
  for(var i = (regions.length - 1); i >= 0; i--) {
153
216
  if(!regions[i].permanent) {
154
- cheesecake.stage.remove(regions[i]);
217
+ mainLayer.remove(regions[i]);
155
218
  }
156
219
  }
220
+ mainLayer.clear();
157
221
  this.setHighlightedSector(sector);
158
222
 
159
223
  //Add auxiliar sectors
@@ -167,21 +231,22 @@ var socialCheesecake = socialCheesecake || {};
167
231
  delta : 2 * Math.PI - sector.delta,
168
232
  rOut : cheesecake.rMax,
169
233
  mouseout : {
170
- color : socialCheesecake.Cheesecake.getGreySectorFillColor(),
234
+ color : socialCheesecake.colors.greySector.background,
171
235
  callback : function() {
172
236
  document.body.style.cursor = "default";
173
237
  }
174
238
  },
175
- mousedown : { color : socialCheesecake.Cheesecake.getGreySectorFocusColor() },
176
- mouseup : { color : socialCheesecake.Cheesecake.getGreySectorFillColor() },
239
+ mousedown : { color : socialCheesecake.colors.greySector.highlight },
240
+ mouseup : { color : socialCheesecake.colors.greySector.background },
177
241
  mouseover : {
178
- color : socialCheesecake.Cheesecake.getGreySectorHoverColor(),
242
+ color : socialCheesecake.colors.greySector.hover,
179
243
  callback : function() {
180
244
  document.body.style.cursor = "pointer";
181
245
  }
182
246
  },
183
- color : socialCheesecake.Cheesecake.getGreySectorFillColor(),
184
- textAndStrokeColor : socialCheesecake.Cheesecake.getGreySectorTextAndStrokeColor(),
247
+ color : socialCheesecake.colors.greySector.background,
248
+ fontColor : socialCheesecake.colors.greySector.font,
249
+ borderColor : socialCheesecake.colors.greySector.border,
185
250
  auxiliar : true
186
251
  };
187
252
  var dummySettings = {
@@ -212,14 +277,13 @@ var socialCheesecake = socialCheesecake || {};
212
277
  var dummySector = new socialCheesecake.Sector(dummySettings)
213
278
  cheesecake.auxiliarSectors.push(dummySector);
214
279
 
215
- cheesecake.stage.add(greySector.getRegion());
216
- cheesecake.stage.add(dummySector.getRegion());
280
+ mainLayer.add(greySector.getRegion());
281
+ mainLayer.add(dummySector.getRegion());
217
282
 
218
283
  //Animations
219
284
  var greyMousedownCallback = function() {
220
285
  greySector.label = "";
221
286
  cheesecake.unfocusAndUnblurCheesecake();
222
- cheesecake.grid.showAll();
223
287
  }
224
288
  var greyResizeCallback = function() {
225
289
  greySector.mousedown.callback = greyMousedownCallback;
@@ -256,18 +320,27 @@ var socialCheesecake = socialCheesecake || {};
256
320
  }
257
321
  socialCheesecake.Cheesecake.prototype.recoverCheesecake = function() {
258
322
  var cheesecake = this;
259
- var regions = cheesecake.stage.getShapes();
323
+ var lastSector = this.highlightedSector;
324
+ var mainLayer = this.stage.mainLayer;
325
+ var regions = mainLayer.getShapes();
260
326
 
261
327
  //Delete the auxiliar sectors
262
328
  for(var i = (regions.length - 1); i >= 0; i--) {
263
329
  if(!regions[i].permanent) {
264
- cheesecake.stage.remove(regions[i]);
330
+ mainLayer.remove(regions[i]);
331
+ cheesecake.auxiliarSectors.pop();
265
332
  }
266
333
  }
267
- cheesecake.auxiliarSectors.pop();
268
-
334
+ mainLayer.clear();
335
+
269
336
  // Add the former sectors and actors
270
337
  cheesecake.draw();
338
+ if(lastSector){
339
+ lastSector.color = lastSector.originalAttr.color;
340
+ lastSector.fan(false);
341
+ lastSector.unfocus();
342
+ this.setHighlightedSector(null);
343
+ }
271
344
  cheesecake.grid.fadeInAll(300, true);
272
345
  }
273
346
  socialCheesecake.Cheesecake.prototype.unfocusAndUnblurCheesecake = function() {
@@ -290,7 +363,6 @@ var socialCheesecake = socialCheesecake || {};
290
363
  //Animate and go back to the general view
291
364
  sectorNewDelta = cheesecake.sectors[sector.simulate].delta;
292
365
  sectorNewPhi = cheesecake.sectors[sector.simulate].phi;
293
- this.setHighlightedSector(null);
294
366
  sector.putTogether();
295
367
  sector.resizeDelta({
296
368
  anchor : "M",
@@ -318,99 +390,93 @@ var socialCheesecake = socialCheesecake || {};
318
390
  /**
319
391
  * actorId - actor which changes one of its parents
320
392
  */
321
- socialCheesecake.Cheesecake.prototype.updateActorMembership = function (actorId){
322
- var changes = this.changes;
393
+ socialCheesecake.Cheesecake.prototype.updateActorMembership = function (actor){
394
+ var changes = this._changes;
323
395
  var grid = this.grid;
324
396
  var changesInActors;
325
397
  var alreadyChanged = false;
326
- var actorParents = grid.getActor(actorId).parents;
327
- var actorSubsectors = [];
328
-
329
- for(var parent in actorParents){
330
- actorSubsectors.push(actorParents[parent].id);
331
- }
398
+ var actorId = actor.id;
399
+ var actorParents = actor.getParentsIds();
400
+ var actorName = actor.name;
401
+ var actorExtraInfo = actor.extraInfo;
402
+ var onChange = this.onChange;
332
403
 
333
404
  if(changes.actors != undefined){
334
405
  changesInActors = changes.actors
335
- for( var actor in changesInActors){
336
- if(changesInActors[actor].id == actorId){
406
+ for( var a in changesInActors){
407
+ if(changesInActors[a].id == actorId){
337
408
  alreadyChanged = true;
338
- changesInActors[actor].subsectors = actorSubsectors;
409
+ changesInActors[a].subsectors = actorParents;
339
410
  }
340
411
  }
341
412
  if(!alreadyChanged){
342
413
  changesInActors.push({
343
414
  id : actorId,
344
- subsectors : actorSubsectors
415
+ subsectors : actorParents,
416
+ name : actorName,
417
+ extraInfo : actorExtraInfo,
418
+ justAdded : false
345
419
  });
346
420
  }
347
421
  }else{
348
422
  changes.actors = [];
349
423
  changes.actors.push({
350
424
  id : actorId,
351
- subsectors : actorSubsectors
425
+ subsectors : actorParents,
426
+ name : actorName,
427
+ extraInfo : actorExtraInfo,
428
+ justAdded : false
352
429
  });
353
430
  }
431
+ //Execute onChange Callback
432
+ onChange(this);
354
433
  }
355
434
 
356
435
  socialCheesecake.Cheesecake.prototype.calculatePortions = function (){
357
436
  var sectors = this.sectors;
358
437
  var match = this.matchActorsNumber;
359
438
  var deltaExtra = Math.PI / 8;
360
- var deltaSector;
361
- var minDeltaSector = Math.PI / 6;
439
+ var minDeltaSector = Math.PI / 8;
362
440
  var phi = ((5 * Math.PI) / 4) - (deltaExtra / 2);
363
- var sectorActors;
441
+ var sectorActors = [];
442
+ var sectorPortions = [];
443
+ var totalSectors = sectors.length;
364
444
  var totalActors = 0;
365
- var consideredActors = 0;
366
- var littleSectors = 0;
367
- var isLittle = [];
445
+ var totalAngle = 2*Math.PI;
446
+ var unusedAngle;
368
447
 
369
- sectors[sectors.length-1].phi = phi;
370
- sectors[sectors.length-1].delta = deltaExtra;
371
- sectors[sectors.length-1].originalAttr.phi = sectors[sectors.length-1].phi;
372
- sectors[sectors.length-1].originalAttr.delta = sectors[sectors.length-1].delta;
373
- phi += deltaExtra;
374
-
375
- if(this.grid.actors.length == 0) match =false;
376
- if(match){
377
- //Calculate total number of actors
378
- for (var i = 0; i < sectors.length -1; i++){
379
- totalActors += (sectors[i].actors.length);
380
- }
381
- consideredActors = totalActors;
382
- //Calculate percentage of actors of each sector
383
- for (var i = 0; i < sectors.length -1; i++){
384
- sectorActors = sectors[i].actors.length;
385
- if( sectorActors / totalActors <= 0.1){
386
- isLittle[i] = true;
387
- littleSectors++;
388
- consideredActors -= sectors[i].actors.length;
389
- }
390
- }
391
- //Assign width
392
- for (var i = 0; i < sectors.length -1; i++){
393
- if(isLittle[i]){
394
- deltaSector = minDeltaSector;
395
- }else{
396
- deltaSector = (sectors[i].actors.length / consideredActors)*
397
- (2*Math.PI - deltaExtra - littleSectors*minDeltaSector);
398
- }
399
- sectors[i].phi = phi;
400
- sectors[i].delta = deltaSector;
401
- sectors[i].originalAttr.phi = sectors[i].phi;
402
- sectors[i].originalAttr.delta = sectors[i].delta;
403
- phi += deltaSector;
404
- }
448
+ //Begin with the extra Sector, if it exists
449
+ if (sectors[sectors.length-1].auxiliar){
450
+ sectors[sectors.length-1].phi = phi;
451
+ sectors[sectors.length-1].delta = deltaExtra;
452
+ sectors[sectors.length-1].originalAttr.phi = sectors[sectors.length-1].phi;
453
+ sectors[sectors.length-1].originalAttr.delta = sectors[sectors.length-1].delta;
454
+ phi += deltaExtra;
455
+ totalSectors = sectors.length -1;
456
+ totalAngle -= deltaExtra;
457
+ }
458
+ if(!match){
459
+ unusedAngle = 0;
405
460
  }else{
406
- deltaSector = (2 * Math.PI - deltaExtra) / (sectors.length-1);
407
- for (var i = 0; i < sectors.length -1; i++){
408
- sectors[i].phi = phi;
409
- sectors[i].delta = deltaSector;
410
- sectors[i].originalAttr.phi = sectors[i].phi;
411
- sectors[i].originalAttr.delta = sectors[i].delta;
412
- phi += deltaSector;
461
+ unusedAngle = totalAngle - totalSectors * minDeltaSector
462
+ }
463
+ for(var i = 0; i < totalSectors; i++) {
464
+ sectorActors[i] = sectors[i].actors.length;
465
+ totalActors += sectorActors[i];
466
+ sectorPortions[i] = minDeltaSector;
467
+ if(!match) sectorPortions[i] = totalAngle / totalSectors;
468
+ }
469
+ for(var i = 0; i < totalSectors; i++) {
470
+ if(totalActors!=0){
471
+ sectorPortions[i] += (sectorActors[i] / totalActors) * unusedAngle;
472
+ }else{
473
+ sectorPortions[i] = totalAngle / totalSectors;
413
474
  }
475
+ sectors[i].phi = phi;
476
+ sectors[i].delta = sectorPortions[i];
477
+ sectors[i].originalAttr.phi = sectors[i].phi;
478
+ sectors[i].originalAttr.delta = sectors[i].delta;
479
+ phi += sectors[i].delta;
414
480
  }
415
481
  }
416
482
 
@@ -423,152 +489,63 @@ var socialCheesecake = socialCheesecake || {};
423
489
  }
424
490
  }
425
491
 
426
- socialCheesecake.Cheesecake.prototype.getChanges = function (){
427
- return this.changes;
492
+ socialCheesecake.Cheesecake.prototype.getSectorById = function(id){
493
+ var sectors = this.sectors;
494
+ var sector;
495
+ for (var i in sectors){
496
+ if (sectors[i].id == id){
497
+ sector = sectors[i];
498
+ break;
499
+ }
500
+ }
501
+ return sector;
428
502
  }
429
503
 
430
- /**
431
- * sector - sector to open or to close
432
- * open - true: expand sector
433
- * - false: shrink sector
434
- */
435
- socialCheesecake.Cheesecake.prototype.fanInSector = function (sector, open){
504
+ socialCheesecake.Cheesecake.prototype.getSubsectorById = function(id){
436
505
  var sectors = this.sectors;
437
- var minDelta = Math.PI/5;
438
- var prevSectorIndex = 0;
439
- var laterSectorIndex = 0;
440
- var deltaToChange = 0;
441
-
442
- if(open && (sector.delta >= minDelta)) return;
443
-
444
- //Find the sector's neighbours
445
- for(var i= 0; i<sectors.length; i++){
446
- if(sectors[i]=== sector){
447
- prevSectorIndex = i-1;
448
- laterSectorIndex = (i+1);
449
- //console.log("current "+i)
506
+ var subsectors;
507
+ var subsector;
508
+ for (var i in sectors){
509
+ subsectors = sectors[i].subsectors;
510
+ for (var j in subsectors){
511
+ if (subsectors[j].id == id){
512
+ subsector = subsectors[j];
513
+ break;
514
+ }
450
515
  }
451
516
  }
452
- if(prevSectorIndex < 0) prevSectorIndex = sectors.length -1;
453
- if(laterSectorIndex >= sectors.length) laterSectorIndex = 0;
454
-
455
- //Animate the three sectors
456
- if(open){
457
- deltaToChange = (minDelta - sector.delta)/2;
458
- sector.resizeDelta({
459
- anchor: "m",
460
- delta: minDelta
461
- });
462
- console.log("delta to change "+ deltaToChange);
463
- console.log("delta of prev "+ sectors[prevSectorIndex].delta);
464
- console.log("delta of later "+ sectors[laterSectorIndex].delta);
465
- sectors[prevSectorIndex].resizeDelta({
466
- anchor: "b",
467
- delta : (sectors[prevSectorIndex].delta - deltaToChange)
468
- });
469
- sectors[laterSectorIndex].resizeDelta({
470
- anchor: "e",
471
- delta : (sectors[laterSectorIndex].delta - deltaToChange)
472
- });
473
- }else{
474
- sector.resizeDelta({
475
- anchor: "m",
476
- delta: sector.originalAttr.delta
477
- });
478
- sectors[prevSectorIndex].resizeDelta({
479
- anchor: "b",
480
- delta : sectors[prevSectorIndex].originalAttr.delta
481
- });
482
- sectors[laterSectorIndex].resizeDelta({
483
- anchor: "e",
484
- delta : sectors[laterSectorIndex].originalAttr.delta
485
- });
486
- }
487
- }
488
- //Colors and text style settings
489
- /** Sector Normal Fill Color (also mouseout and mouseup) */
490
- socialCheesecake.Cheesecake.getSectorFillColor = function (){
491
- return sectorFillColor;
492
- }
493
- socialCheesecake.Cheesecake.setSectorFillColor = function (newColor){
494
- if(typeof newColor === "string") sectorFillColor = newColor;
495
- }
496
- /** Extra Sectors Normal Fill Color (also mouseout and mouseup) */
497
- socialCheesecake.Cheesecake.getExtraSectorFillColor = function (){
498
- return extraSectorFillColor;
499
- }
500
- socialCheesecake.Cheesecake.setExtraSectorFillColor = function (newColor){
501
- if(typeof newColor === "string") extraSectorFillColor = newColor;
502
- }
503
- /** Grey Sectors Normal Fill Color (also mouseout and mouseup) */
504
- socialCheesecake.Cheesecake.getGreySectorFillColor = function (){
505
- return greySectorFillColor;
506
- }
507
- socialCheesecake.Cheesecake.setGreySectorFillColor = function (newColor){
508
- if(typeof newColor === "string") greySectorFillColor = newColor;
509
- }
510
- /** Sector Focus Fill Color (mousedown) */
511
- socialCheesecake.Cheesecake.getSectorFocusColor = function (){
512
- return sectorFocusColor;
513
- }
514
- socialCheesecake.Cheesecake.setSectorFocusColor = function (newColor){
515
- if(typeof newColor === "string") sectorFocusColor = newColor;
516
- }
517
- /** Extra Sectors Focus Fill Color (mousedown) */
518
- socialCheesecake.Cheesecake.getExtraSectorFocusColor = function (){
519
- return extraFocusColor;
520
- }
521
- socialCheesecake.Cheesecake.setExtraSectorFocusColor = function (newColor){
522
- if(typeof newColor === "string") extraFocusColor = newColor;
523
- }
524
- /** Grey Sectors Focus Fill Color (mousedown) */
525
- socialCheesecake.Cheesecake.getGreySectorFocusColor = function (){
526
- return greyFocusColor;
527
- }
528
- socialCheesecake.Cheesecake.setGreySectorFocusColor = function (newColor){
529
- if(typeof newColor === "string") greyFocusColor = newColor;
517
+ return subsector;
530
518
  }
531
- /** Sector Hover Fill Color (mouseover) */
532
- socialCheesecake.Cheesecake.getSectorHoverColor = function (){
533
- return sectorHoverColor;
534
- }
535
- socialCheesecake.Cheesecake.setSectorHoverColor = function (newColor){
536
- if(typeof newColor === "string") sectorHoverColor = newColor;
537
- }
538
- /** Extra Sectors Hover Fill Color (mouseover) */
539
- socialCheesecake.Cheesecake.getExtraSectorHoverColor = function (){
540
- return extraHoverColor;
541
- }
542
- socialCheesecake.Cheesecake.setExtraSectorHoverColor = function (newColor){
543
- if(typeof newColor === "string") extraHoverColor = newColor;
544
- }
545
- /** Grey Sectors Hover Fill Color (mouseover) */
546
- socialCheesecake.Cheesecake.getGreySectorHoverColor = function (){
547
- return greyHoverColor;
548
- }
549
- socialCheesecake.Cheesecake.setGreySectorHoverColor = function (newColor){
550
- if(typeof newColor === "string") greyHoverColor = newColor;
551
- }
552
- /** Sector Text and Stroke Color */
553
- socialCheesecake.Cheesecake.getSectorTextAndStrokeColor = function (){
554
- return sectorTextAndStrokeColor;
555
- }
556
- socialCheesecake.Cheesecake.setSectorTextAndStrokeColor = function (newColor){
557
- if(typeof newColor === "string") sectorTextAndStrokeColor = newColor;
519
+
520
+ socialCheesecake.Cheesecake.prototype.getChanges = function (){
521
+ return this._changes;
558
522
  }
559
- /** Extra Sectors Hover Fill Color (mouseover) */
560
- socialCheesecake.Cheesecake.getExtraSectorTextAndStrokeColor = function (){
561
- return extraTextAndStrokeColor;
523
+
524
+ socialCheesecake.Cheesecake.prototype.getInitialState = function (){
525
+ return this._initialState;
562
526
  }
563
- socialCheesecake.Cheesecake.setExtraSectorTextAndStrokeColor = function (newColor){
564
- if(typeof newColor === "string") extraTextAndStrokeColor = newColor;
527
+
528
+ socialCheesecake.Cheesecake.prototype._setInitialState = function (){
529
+ var state = this._initialState;
530
+ var actors = this.grid.actors;
531
+
532
+ state.actors = [];
533
+ for( var actor in actors ){
534
+ state.actors.push({
535
+ id: actors[actor].id ,
536
+ subsectors : actors[actor].getParentsIds(),
537
+ name : actors[actor].name,
538
+ extraInfo : actors[actor].extraInfo
539
+ })
540
+ }
565
541
  }
566
- /** Grey Sectors Hover Fill Color (mouseover) */
567
- socialCheesecake.Cheesecake.getGreySectorTextAndStrokeColor = function (){
568
- return greyTextAndStrokeColor;
542
+
543
+ /** Number of actors to animate */
544
+ socialCheesecake.Cheesecake.getMaxVisibleActors = function(){
545
+ return maxVisibleActors;
569
546
  }
570
- socialCheesecake.Cheesecake.setGreySectorTextAndStrokeColor = function (newColor){
571
- if(typeof newColor === "string") greyTextAndStrokeColor = newColor;
547
+ socialCheesecake.Cheesecake.setMaxVisibleActors = function(number){
548
+ if(typeof number === "number") maxVisibleActors = number;
572
549
  }
573
550
 
574
551
  })();