/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk
19.2.1 by elof.bigestans at gmail
* Fixed bugs #1164530, #1164535, #1164537 and #1164542
1
var startx = 0;
2
var starty = 0;
3
var deltax = 0;
4
var deltay = 0;	
5
var gridsize = 20;
6
7
// Multi-select move offset
8
var offsx = 0;
9
var offsy = 0;
10
11
// Drawing Globals -- For while in transit drawing
12
var drawlinesx;
13
var drawlinesy;
14
var drawlinedx;
15
var drawlinedy;
16
var drawlinekind = 0;
17
18
// List of objects
19
var Objects = new Array();
20
21
// List of identifiers 
22
var Selected = new Array();
23
24
// List of selected object identifiers 
25
var Identifiers = new Array();
26
27
// The context object
28
var ContextObj;
29
30
// Mouse Down Result
31
var downRes;
32
// User Interface Mode Variables
33
var multiselect = 0;
34
var dragsensitivity = 12;
35
var sidetol = 12;
36
var printstr;
37
38
/*
39
 *  User interface callbacks
40
 */
41
function handler_mouseup() {
42
	if(clickstate == 1) {
43
44
		// Either select on/off for multi or single select
45
		if(multiselect) {
46
			if(Selected[downRes.objid]) {
47
				Selected[downRes.objid] = false;
48
			} else {
49
				Selected[downRes.objid] = true;
50
			}
51
		} else {
52
			if(ContextObj == downRes.objid) {
53
					ContextObj = "";
54
			} else {
55
				ContextObj = downRes.objid;
56
			}
57
		}
58
	} else if(clickstate == 8) {
59
60
		// Draw Attribute Line
61
		upRes=mouseover(gridx,gridy);
62
		if(upRes.code != "None") {
63
			obj = Objects[downRes.objid];
64
			if(upRes.typ == "ERAttribute" || upRes.typ == "Entity" || upRes.typ == "ERRel") {
65
				obj.DrawtoID = upRes.objid;
66
				obj.DrawfromSide = downRes.side;
67
				if(upRes.side != "None") {
68
					obj.DrawtoSide = upRes.side;
69
					obj.DrawtoPerc = upRes.sideperc;
70
				} else {
71
					upobj = Objects[downRes.objid];
72
					var sid = 1;
73
					var	perco = 0.5;
74
					var x1g = Math.abs(upRes.x1 - gridx);
75
					var x2g = Math.abs(upRes.x2 - gridx);
76
					var y1g = Math.abs(upRes.y1 - gridy);
77
					var y2g = Math.abs(upRes.y2 - gridy);
78
					if(x1g <= x2g && x1g <= y1g && x1g <= y2g){
79
						sid = 1;
80
						perco = makesideperc(gridy, upRes.y1, upRes.y2);
81
					} else if(x2g <= x1g && x2g <= y1g && x2g <= y2g){
82
						sid = 3;
83
						perco = makesideperc(gridy, upRes.y1, upRes.y2);
84
					} else if(y1g <= x1g && y1g <= x2g && y1g <= y2g){
85
						sid = 4;
86
						perco = makesideperc(gridx, upRes.x1, upRes.x2);
87
					} else if(y2g <= x1g && y2g <= x2g && y2g <= y1g){
88
						sid = 2;
89
						perco = makesideperc(gridx, upRes.x1, upRes.x2);
90
					}
91
					obj.DrawtoSide = sid;
92
					obj.DrawtoPerc = perco;
93
				}
94
				if(upRes.typ == "ERAttribute" || upRes.typ == "ERRel") obj.DrawtoPerc = 0.5;
95
			}
96
		}
97
	} else if(clickstate == 9) {
98
99
		// Draw Relationship line
100
		upRes = mouseover(gridx, gridy);
101
		if(upRes.code != "None") {
102
			obj = Objects[downRes.objid];
103
			if(upRes.side != "None") {
104
				if(obj.DrawtoID == "None") {
105
					obj.DrawtoID = upRes.objid;
106
					obj.DrawtoSide = upRes.side;
107
					obj.DrawtoPerc = upRes.sideperc;
108
					obj.DrawfromSide = downRes.side;
109
				} else {
110
					obj.DrawtoIDDest = upRes.objid;
111
					obj.DrawtoSideDest = upRes.side;
112
					obj.DrawtoPercDest = upRes.sideperc;
113
					obj.DrawfromSideDest = downRes.side;										
114
				}
115
			} else {
116
				upobj = Objects[downRes.objid];
117
				var sid = 1;
118
				var	perco = 0.5;
119
				var x1g = Math.abs(upRes.x1-gridx);
120
				var x2g = Math.abs(upRes.x2-gridx);
121
				var y1g = Math.abs(upRes.y1-gridy);
122
				var y2g = Math.abs(upRes.y2-gridy);
123
				if(x1g <= x2g && x1g <= y1g && x1g <= y2g) {
124
					sid = 1;
125
					perco = makesideperc(gridy, upRes.y1, upRes.y2);
126
				} else if(x2g <= x1g && x2g <= y1g && x2g <= y2g) {
127
					sid = 3;
128
					perco = makesideperc(gridy, upRes.y1, upRes.y2);
129
				} else if(y1g <= x1g && y1g <= x2g && y1g <= y2g) {
130
					sid = 4;
131
					perco = makesideperc(gridx, upRes.x1, upRes.x2);
132
				} else if(y2g <= x1g && y2g <= x2g && y2g <= y1g){
133
					sid = 2;
134
					perco = makesideperc(gridx, upRes.x1, upRes.x2);
135
				}									
136
				if(obj.DrawtoID == "None") {
137
					obj.DrawtoID = upRes.objid;
138
					obj.DrawtoSide = sid;
139
					obj.DrawtoPerc = perco;
140
					obj.DrawfromSide = downRes.side;										
141
				} else {
142
					obj.DrawtoIDDest = upRes.objid;
143
					obj.DrawtoSideDest = sid;
144
					obj.DrawtoPercDest = perco;
145
					obj.DrawfromSideDest = downRes.side;										
146
				}
147
			}								
148
		}
149
	}
150
	clickstate = 0;
151
	cpsel = 0;
152
	drawlinekind = 0;		
153
}
154
/*
155
 *	Mouse down state
156
 */
157
function handler_mousedown() {
158
	clickstate = 1;
159
	downRes = mouseover(gridx, gridy);
160
	startx = gridx;
161
	starty = gridy;	
162
}
163
164
/*
165
 *	Mouse move
166
 */
167
function handler_mousemove(cx, cy) {
8.2.2 by Daniel Johansson
Broken out CSS and JavaScript from HTML in ER
168
//			gridx=Math.round((cx-(gridsize/2.0))/gridsize)*gridsize;
169
//			gridy=Math.round((cy-(gridsize/2.0))/gridsize)*gridsize;				
19.2.1 by elof.bigestans at gmail
* Fixed bugs #1164530, #1164535, #1164537 and #1164542
170
	gridx = cx;
171
	gridy = cy;
172
	deltax = startx - gridx;
173
	deltay = starty - gridy;		
174
	// We start drag mode
175
	if((distance(gridx, gridy, startx, starty) > dragsensitivity) && clickstate == 1) {
176
		clickstate = 2;
177
	}
178
	// We are in drag mode				
179
	if(clickstate == 2) {																										
180
		// Single Object Move - If Not Selected, Or if Selected and Center Area Is Dragged
181
		if((downRes.typ == "Entity" || downRes.typ == "ERAttribute" || downRes.typ == "ERRel") && (downRes.code == "NonSel" || (downRes.code == "Cont" && downRes.side == "None") || (downRes.code == "ContDraw" && downRes.side == "None"))) {
182
			clickstate = 3;
183
		}
184
		// Single Object Scale Left
185
		if((downRes.typ == "Entity" || downRes.typ == "ERAttribute") && (downRes.code == "Cont" && downRes.side == "1")) {
186
			clickstate=4;
187
		}
188
		// Single Object Scale Bottom
189
		if((downRes.typ == "Entity" || downRes.typ == "ERAttribute") && (downRes.code == "Cont" && downRes.side == "2")) {
190
			clickstate=5;
191
		}
192
		// Single Object Scale Right
193
		if((downRes.typ == "Entity" || downRes.typ == "ERAttribute") && (downRes.code == "Cont" && downRes.side == "3")) {
194
			clickstate=6;
195
		}
196
		// Single Object Scale Top
197
		if((downRes.typ == "Entity" || downRes.typ == "ERAttribute") && (downRes.code == "Cont" && downRes.side == "4")) {
198
			clickstate=7;
199
		}
200
		if(downRes.typ == "ERAttribute" && downRes.code == "ContDraw" && downRes.side != "None") {													
201
			clickstate=8; // Attribute Connection Draw
202
			drawlinekind=1;	// Tell drawing engine to draw attribute line symbol
203
			if(downRes.side == "1") {
204
				drawlinesx = downRes.x1; // Initiate start parameters for line drawing left side
205
				drawlinesy = downRes.y1 + ((downRes.y2 - downRes.y1) * 0.5);									
206
			} else if(downRes.side == "2") {
207
				drawlinesx = downRes.x1 + ((downRes.x2 - downRes.x1) * 0.5); // Initiate start parameters for line drawing bottom side
208
				drawlinesy = downRes.y2;
209
			} else if(downRes.side == "3") {
210
				drawlinesx = downRes.x2; // Initiate start parameters for line drawing left side
211
				drawlinesy = downRes.y1 + ((downRes.y2 - downRes.y1) * 0.5);									
212
			} else if(downRes.side == "4") {
213
				drawlinesx = downRes.x1 + ((downRes.x2 - downRes.x1) * 0.5); // Initiate start parameters for line drawing bottom side
214
				drawlinesy = downRes.y1;
215
			}
216
			drawlinedx = drawlinesx;
217
			drawlinedy = drawlinesy;	
218
		}
219
		if(downRes.typ == "ERRel" && downRes.code == "ContDraw" && downRes.side != "None") {						
220
			var obj=Objects[downRes.objid];													
221
			if(downRes.side != obj.DrawfromSide && downRes.side != obj.DrawfromSideDest) {
222
				clickstate = 9; // Attribute Connection Draw
223
				drawlinekind = 1; // Tell drawing engine to draw relation line symbol 
224
				if(downRes.side == "1") {
225
					drawlinesx = downRes.x1; // Initiate start parameters for line drawing left side
226
					drawlinesy = downRes.y1 + ((downRes.y2 - downRes.y1) * 0.5);									
227
				} else if(downRes.side == "2") {
228
					drawlinesx = downRes.x1 + ((downRes.x2 - downRes.x1) * 0.5); // Initiate start parameters for line drawing bottom side
229
					drawlinesy = downRes.y2;
230
				} else if(downRes.side == "3") {
231
					drawlinesx = downRes.x2; // Initiate start parameters for line drawing left side
232
					drawlinesy = downRes.y1 + ((downRes.y2 - downRes.y1) * 0.5);									
233
				} else if(downRes.side == "4") {
234
					drawlinesx = downRes.x1 + ((downRes.x2 - downRes.x1) * 0.5); // Initiate start parameters for line drawing bottom side
235
					drawlinesy = downRes.y1;
236
				}
237
				drawlinedx = drawlinesx;
238
				drawlinedy = drawlinesy;
239
			}
240
		}				
241
	}
242
	if(clickstate > 2) {
243
		var obj = Objects[downRes.objid];
244
	}
245
	if(clickstate == 3) { // We are in single rectangular object move 
246
		obj.x1 = downRes.x1 - deltax;
247
		obj.y1 = downRes.y1 - deltay;
248
		obj.x2 = downRes.x2 - deltax;
249
		obj.y2 = downRes.y2 - deltay;
250
	} else if(clickstate == 4) { // We are in single rectangular object scale left 
251
		if((obj.x2 - downRes.x1 + deltax) > 60) obj.x1 = downRes.x1 - deltax;
252
	} else if(clickstate == 5) { // We are in single rectangular object scale bottom
253
		if((downRes.y2 - obj.y1 - deltay) > 40) obj.y2 = downRes.y2 - deltay;
254
	} else if(clickstate==6) {	// We are in single rectangular object scale right
255
		if((downRes.x2 - obj.x1 - deltax) > 60) obj.x2 = downRes.x2 - deltax;
256
	} else if(clickstate == 7) { // We are in single rectangular object scale top
257
		if((obj.y2 - downRes.y1 + deltay) > 40) obj.y1 = downRes.y1 - deltay;
258
	} else if(clickstate == 8 || clickstate == 9) { // We are in straight connective line drawing mode 
259
		drawlinedx = gridx;
260
		drawlinedy = gridy;
261
	}
262
}
263
264
/*
265
 *	Call-forward for mouse-over event
266
 */
267
function mouseover(x, y) {
268
	// Code of touch, and if available object id and id of side of object that was touched
269
	// Tolerances included as constant
270
	var obj_code = "None";
271
	var obj_id = "None";
272
	var obj_sidentifier =" None";
273
	var obj_sideperc = 0;
274
	var obj_centerdist = 0;
275
	var obj_type = "None";
276
	var obj_x1 = 0; 
277
	var obj_y1 = 0; 
278
	var obj_x2 = 0; 
279
	var obj_y2 = 0;
280
	var Cont;
281
	var found = 0;
282
	var side;
283
	for(j = 0; j < Identifiers.length; j++) {
284
		var objid = Identifiers[j];
285
		var obj = Objects[objid];				
286
		var Sel = Selected[objid];
287
		if(ContextObj == objid) {
288
			Cont = 1;
289
		} else {
290
			Cont = 0;
291
		}
292
		// Compute coordinates including offset
293
		if(obj.type == "Entity" || obj.type == "ERAttribute" || obj.type == "ERRel") {										
294
			x1 = obj.x1 + offsx;
295
			y1 = obj.y1 + offsy;
296
			x2 = obj.x2 + offsx;
297
			y2 = obj.y2 + offsy;
298
			rx = (x2 - x1) * 0.5;
299
			ry = (y2 - y1) * 0.5;
300
		}
301
		found = 0;
302
		// For each kind of clickable object, check if we are inside object and if so assign variables
303
		// Any general properties for all object types are set when "found" is true
304
		if(obj.type == "Entity") {				
305
			if(x > (x1 - sidetol) && y > (y1 - sidetol ) && x < (x2 + sidetol) && y < (y2 + sidetol)) {
306
				obj_code = "NonSel";
307
				if(Sel) {
308
					obj_code = "Sel";
309
				}
310
				if(Cont) {
311
					obj_code = "Cont";
312
				}
313
				side = computeside(x, y, x1, y1, x2, y2, sidetol);
314
				obj_sidentifier = side.side;
315
				obj_sideperc = side.perc;
316
				obj_centerdist = side.dist;					
317
				found = 1;																	
318
			}
319
		} else if(obj.type=="ERAttribute") {
320
				if(x > (x1 - sidetol) && y > (y1 - sidetol) && x < (x2 + sidetol) && y < (y2 + sidetol)) {
321
					obj_code = "NonSel";
322
					if(Sel) {
323
						obj_code="Sel";
324
					}							
325
					if(Cont) {
326
						if(obj.DrawtoID == "None") {
327
							obj_code = "ContDraw";											
328
						} else {
329
							obj_code = "Cont";
330
						}
331
					} 
332
					side = computeside(x, y, x1, y1, x2, y2, sidetol);
333
					obj_sidentifier = side.side;
334
					obj_sideperc = side.perc;
335
					obj_centerdist = side.dist;
336
					found = 1;
337
				}
338
		} else if(obj.type == "ERRel") {
339
			if(x > (x1 - sidetol) && y > (y1 - sidetol) && x < (x2 + sidetol) && y < (y2 + sidetol)) {
340
				xk = x - x1;
341
				// Colision detection against diamond
342
				var inside = 0;																		
343
				if(xk <= rx) {
344
					if(y > (y1 + ry - xk - sidetol) && y < (y1 + ry + xk + sidetol)) {
345
						inside = 1;
346
					}
347
				} else {
348
					if(y > (y1 - rx + xk - sidetol) && y < ( y2 + rx - xk + sidetol)) {
349
						inside = 1;
350
					}
351
				}
352
				if(inside) {	
353
					if((x > (x1 - sidetol)) && (x < (x1 + sidetol)) && (y > (y1 + ry - sidetol)) && (y < (y1 + ry + sidetol))) {
354
						obj_sidentifier = 1;
355
					}
356
					if((x > (x1 + rx - sidetol)) && (x < (x1 + rx + sidetol)) && (y > (y2 - sidetol)) && (y < (y2 + sidetol))) {
357
						obj_sidentifier = 2;
358
					}
359
					if((x > (x2 - sidetol)) && (x < (x2 + sidetol)) && (y > (y1 + ry - sidetol)) && (y < (y1 + ry + sidetol))) {
360
						obj_sidentifier = 3;
361
					}
362
					if((x > (x1 + rx - sidetol)) && (x < (x1 + rx + sidetol)) && (y > (y1 - sidetol)) && (y < (y1 + sidetol))) {
363
						obj_sidentifier = 4;
364
					}
365
					obj_code = "NonSel";
366
					if(Sel) {
367
						obj_code = "Sel";
368
					}
369
					if(Cont) {
370
						if(obj.DrawtoID == "None"){
371
							obj_code = "ContDraw";											
372
						} else if(obj.DrawtoIDDest == "None") {
373
							obj_code = "ContDraw";											
374
						} else {
375
							obj_code = "Cont";
376
						}
377
					} 
378
					obj_sideperc = 0.5;
379
					found = 1;
380
				}
381
			}			
382
		}
383
		if(found == 1) {
384
			// Save coordinates at time of click									
385
			obj_x1 = x1;
386
			obj_y1 = y1;
387
			obj_x2 = x2;
388
			obj_y2 = y2;						
389
			obj_id = objid;
390
			obj_type = obj.type;
391
			printstr=obj_id + " " + obj_sidentifier + " " + obj_sideperc;
392
		}
393
	}						
394
	return {
395
		objid:obj_id,
396
		code:obj_code,
397
		side:obj_sidentifier,
398
		sideperc:obj_sideperc,
399
		centerdist:obj_centerdist,
400
		typ:obj_type,
401
		x1:obj_x1,
402
		y1:obj_y1,
403
		x2:obj_x2,
404
		y2:obj_y2
405
	}
406
}
407
408
/*
409
 * Turns JSON data into jQuery objects 
410
 */
411
function importdata() {				
412
	for(i = 0; i < 7; i++) {
413
		if(i == 0) {
414
			obj = jQuery.parseJSON('{"type":"ERAttribute","id":"ATT1","kind":"Multiple","name":"Addressfosoppooo","x1":220,"y1":100,"x2":300,"y2":140, "DrawtoID":"None", "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"None", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":""}');
415
		}
416
		if(i == 1) {
417
			obj = jQuery.parseJSON('{"type":"Entity","id":"ENT2","kind":"Weak","name":"Carsmashoepppoloo","x1":100,"y1":160,"x2":220,"y2":220}');
418
		}
419
		if(i == 2) {
420
			obj = jQuery.parseJSON('{"type":"ERAttribute","id":"ATT3","kind":"Key","name":"SSNFooomesPoo","x1":160,"y1":260,"x2":260,"y2":300, "DrawtoID":"None", "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"None", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":""}');
421
		}
422
		if(i == 3) {
423
			obj = jQuery.parseJSON('{"type":"Entity","id":"ENT4","kind":"Strong","name":"Trailerfpdddpeoooooe","x1":320,"y1":260,"x2":420,"y2":320}');
424
		}
425
		if(i == 4) {
426
			obj = jQuery.parseJSON('{"type":"Entity","id":"ENT5","kind":"Strong","name":"Grail","x1":120,"y1":440,"x2":220,"y2":480}');
427
		}
428
		if(i == 5) {
429
			obj = jQuery.parseJSON('{"type":"ERRel","id":"REL6","kind":"Strong","name":"FGFool","x1":460,"y1":160,"x2":520,"y2":220, "DrawtoID":"None", "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"0", "DrawtoCard":"N", "DrawtoRole":"Fumo", "DrawtoXoffs":"20", "DrawtoYoffs":"50", "DrawtoIDDest":"None",  "DrawfromSideDest":"None","DrawtoSideDest":"None", "DrawtoPercDest":"0", "DrawtoDestCard":"N", "DrawtoDestRole":"Luma", "DrawtoDestXoffs":"0", "DrawtoDestYoffs":"-50", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":"","DrawX3":"", "DrawY3":"", "DrawX4":"","DrawY4":""}');
430
		}
431
		if(i == 6) {
432
			obj = jQuery.parseJSON('{"type":"ERRel","id":"REL7","kind":"Weak","name":"PODrool","x1":360,"y1":360,"x2":420,"y2":420, "DrawtoID":"None",  "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"0", "DrawtoCard":"N", "DrawtoRole":"Kumo", "DrawtoXoffs":"60", "DrawtoYoffs":"70", "DrawtoIDDest":"None",  "DrawfromSideDest":"None","DrawtoSideDest":"None", "DrawtoPercDest":"0", "DrawtoDestCard":"N", "DrawtoDestRole":"Zuuma", "DrawtoDestXoffs":"40", "DrawtoDestYoffs":"50", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":"","DrawX3":"", "DrawY3":"", "DrawX4":"","DrawY4":""}');
433
		}
434
		objid = obj.id;
435
		Objects[objid] = obj;
436
		Identifiers.push(objid);
437
	}
438
}
439
440
/* 
441
 * 	prepareobj
442
 * 	Prepares all kinds of objects, with local movement-offset (scrolling offset is handled with transforms??)
443
 * 	Ofss in prepare are not finished.
444
 */
445
function prepareobj(obji) {
446
	var fromobj = Objects[obji];
447
	// Attributes are prepared by re-pointing the DrawX1, DrawY1, DrawX2 and DrawY2 variables and Relationships are prepared by re-pointing DrawX1-DrawX4 and DrawY1-DrawY4
448
	if((fromobj.type == "ERAttribute" || fromobj.type == "ERRel") && fromobj.DrawtoID != "None") {									
449
		var toid = fromobj.DrawtoID;
450
		var toobj = Objects[toid];
451
		var sidek;
452
		if(fromobj.DrawtoIDDest != "None" && fromobj.DrawtoIDDest != undefined) {
453
			var toiddest = fromobj.DrawtoIDDest;
454
			var toobjdest = Objects[toiddest];						
455
			sidek = makeside(fromobj.DrawfromSideDest, fromobj.x1, fromobj.y1, fromobj.x2, fromobj.y2, 0.5);
456
			fromobj.DrawX3 = sidek.x;
457
			fromobj.DrawY3 = sidek.y;
458
			sidek = makeside(fromobj.DrawtoSideDest, toobjdest.x1, toobjdest.y1, toobjdest.x2, toobjdest.y2, fromobj.DrawtoPercDest);
459
			fromobj.DrawX4 = sidek.x;
460
			fromobj.DrawY4 = sidek.y;
461
		}
462
		//printstr=fromobj.DrawfromSide+" "+fromobj.x1+" "+fromobj.y1+" "+fromobj.x2+" "+fromobj.y2+" :: "+fromobj.DrawtoSide+" "+toobj.x1+" "+toobj.y1+" "+toobj.x2+" "+toobj.y2+" "+fromobj.DrawtoPerc;				
463
		sidek = makeside(fromobj.DrawfromSide, fromobj.x1, fromobj.y1, fromobj.x2, fromobj.y2, 0.5);
464
		fromobj.DrawX1 = sidek.x;
465
		fromobj.DrawY1 = sidek.y;				
466
		sidek = makeside(fromobj.DrawtoSide, toobj.x1, toobj.y1, toobj.x2, toobj.y2, fromobj.DrawtoPerc);
467
		fromobj.DrawX2 = sidek.x; 
468
		fromobj.DrawY2 = sidek.y;						
469
	}
470
}
471
472
/*
473
 * 	Drawobj
474
 * 	Draws all kinds of objects, with local movement-offset (scrolling offset is handled with transforms??)
475
 */
476
function drawobj(obji) {
477
	var obj = Objects[obji];
478
	var Sel = Selected[obji];
479
	if(ContextObj == obji) {
480
		Cont = 1;
481
	} else {
482
		Cont = 0;
483
	}
484
	context.strokeStyle = '#000';
485
	context.lineWidth = 2.0;
486
	// Compute coordinates including offset
487
	if(obj.type == "Entity" || obj.type == "ERAttribute" || obj.type == "ERRel") {									
488
		x1 = obj.x1 + offsx;
489
		y1 = obj.y1 + offsy;
490
		x2 = obj.x2 + offsx;
491
		y2 = obj.y2 + offsy;
492
		rx = (x2 - x1) * 0.5;
493
		ry = (y2 - y1) * 0.5;
494
	}
495
	if(obj.type == "Entity") {				
496
		//Draw Local Graphic
497
		drawrect(x1, y1, x2, y2, "#000");
498
		if(obj.kind == "Weak") {
499
			drawrect(x1 + 5, y1 + 5, x2 - 5, y2 - 5, "#000");
500
			cliptext(x1 + 5, y1 + 5, x2 - 5, y2 - 5, obj.name, "20px Calibri", "center", 8, 6, "#000", 1, 0);		
501
502
		} else {
503
			cliptext(x1, y1, x2, y2, obj.name, "20px Calibri", "center", 8, 6, "#000", 1, 0);						
504
		}
505
		// Draw Select Marker
506
		if(Sel || Cont) {
507
			fourpoints(x1, y1 + ry, x2, y1 + ry, x1 + rx, y1, x1 + rx, y2, "#5f8");								
508
		}
509
	} else if(obj.type == "ERAttribute") {
510
		drawellipse(x1, y1, x2, y2);
511
		if(obj.kind == "Key") {
512
			cliptext(x1, y1, x2, y2, obj.name, "20px Calibri", "center", 8, 6, "#000", 2, 1);						
513
		} else {
514
			cliptext(x1, y1, x2, y2, obj.name, "20px Calibri", "center", 8, 6, "#000", 2, 0);												
515
		}
516
		if(obj.DrawtoID != "None") {
517
			drawline(obj.DrawX1, obj.DrawY1, obj.DrawX2, obj.DrawY2, "#000", 2.0);
518
		}
519
		// Draw Select Marker
520
		if(Cont && obj.DrawtoID == "None") {
521
			fourpoints(x1, y1 + ry, x2, y1 + ry, x1 + rx, y1, x1 + rx, y2, "#fa2");
522
		} else if(Sel || (Cont && obj.DrawtoID != "None")) {
523
			fourpoints(x1, y1 + ry, x2, y1 + ry, x1 + rx, y1, x1 + rx, y2, "#5f8");
524
		}
525
	} else if(obj.type == "ERRel") {
526
		if(obj.DrawtoID != "None") {
527
			drawline(obj.DrawX1, obj.DrawY1, obj.DrawX2, obj.DrawY2, "#000", 2.0);
528
			drawcardinality(obj.DrawX2, obj.DrawY2, obj.DrawtoSide, obj.DrawtoCard, obj.DrawtoXoffsCard, obj.DrawtoYoffsCard, "20px Calibri", 20, 1, "#0a0");
529
			drawcardinality(obj.DrawX2, obj.DrawY2, obj.DrawtoSide, obj.DrawtoRole, obj.DrawtoXoffsRole, obj.DrawtoYoffsRole, "20px Calibri", 20, 2, "#0a0");
530
			//function drawcardinality(x,y,side,tex,xoffs,yoffs,font,baseline,sign,color)
531
			//if(i==5) obj = jQuery.parseJSON('{"type":"ERRel","id":"REL6","kind":"Strong","name":"FGFool","x1":460,"y1":160,"x2":520,"y2":220, "DrawtoID":"None", "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"0", "DrawtoCard":"N", "DrawtoRole":"Fumo", "DrawtoXoffsCard":"20", "DrawtoYoffsCard":"50","DrawtoXoffsRole":"20", "DrawtoYoffsRole":"-50", "DrawtoIDDest":"None",  "DrawfromSideDest":"None","DrawtoSideDest":"None", "DrawtoPercDest":"0", "DrawtoDestCard":"1", "DrawtoDestRole":"Luma", "DrawtoDestXoffsCard":"0", "DrawtoDestYoffsCard":"-50","DrawtoDestXoffsRole":"0", "DrawtoDestYoffsRole":"-50", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":"","DrawX3":"", "DrawY3":"", "DrawX4":"","DrawY4":""}');
532
			//if(i==6) obj = jQuery.parseJSON('{"type":"ERRel","id":"REL7","kind":"Weak","name":"PODrool","x1":360,"y1":360,"x2":420,"y2":420, "DrawtoID":"None",  "DrawfromSide":"None","DrawtoSide":"None", "DrawtoPerc":"0", "DrawtoCard":"1", "DrawtoRole":"Kumo", "DrawtoXoffsCard":"60", "DrawtoYoffsCard":"70", "DrawtoXoffsCard":"80", "DrawtoYoffsCard":"-70", "DrawtoIDDest":"None",  "DrawfromSideDest":"None","DrawtoSideDest":"None", "DrawtoPercDest":"0", "DrawtoDestCard":"N", "DrawtoDestRole":"Zuuma", "DrawtoDestXoffsCard":"40", "DrawtoDestYoffsCard":"50", "DrawtoDestXoffsRole":"40", "DrawtoDestYoffsRole":"50", "DrawX1":"", "DrawY1":"", "DrawX2":"","DrawY2":"","DrawX3":"", "DrawY3":"", "DrawX4":"","DrawY4":""}');
533
		}
534
		if(obj.DrawtoIDDest != "None") {
535
			drawline(obj.DrawX3, obj.DrawY3, obj.DrawX4, obj.DrawY4, "#000", 2.0);
536
		}
537
		if(obj.kind == "Weak") {
538
			drawdiamond(x1 - 4, y1 - 4, x2 + 4, y2 + 4);
539
			drawdiamond(x1 + 4, y1 + 4, x2 - 4, y2 - 4);
540
			cliptext(x1 + 8, y1 + 8, x2 - 8, y2 - 8, obj.name, "20px Calibri", "center", 8, 6, "#000", 3, 0);												
541
		} else {
542
			drawdiamond(x1, y1, x2, y2, 0);
543
			cliptext(x1, y1, x2, y2, obj.name, "20px Calibri", "center", 8, 6, "#000", 3, 0);												
544
		}
545
		// Draw Select Markers
546
		if(Sel || (Cont && obj.DrawtoID != "None" && obj.DrawtoIDDest != "None")) {
547
			fourpoints(x1, y1 + ry, x2, y1 + ry, x1 + rx, y1, x1 + rx, y2, "#5f8");
548
		} else if(Cont) {
549
			if(obj.DrawfromSide != 1 && obj.DrawfromSideDest != 1) {
550
				point(x1, y1 + ry, "#fa2");
551
			}
552
			if(obj.DrawfromSide != 2 && obj.DrawfromSideDest != 2) {
553
				point(x1 + rx, y2, "#fa2");
554
			}
555
			if(obj.DrawfromSide != 3 && obj.DrawfromSideDest != 3) {
556
				point(x2, y1 + ry, "#fa2");
557
			}
558
			if(obj.DrawfromSide != 4 && obj.DrawfromSideDest != 4) {
559
				point(x1 + rx, y1, "#fa2");
560
			}
561
		}
562
	}
563
}
564
importdata();
565
566
/*
567
 * 
568
 */
569
function foo() {
570
	context.clearRect(0, 0, 600, 600);
8.2.2 by Daniel Johansson
Broken out CSS and JavaScript from HTML in ER
571
//			overline(gridx,gridy,150,550,550,300,8.0);
19.2.1 by elof.bigestans at gmail
* Fixed bugs #1164530, #1164535, #1164537 and #1164542
572
	// Draw grid lines				
573
	context.strokeStyle = '#ddd';
574
	context.lineWidth = 0.5;
575
	context.beginPath();
576
	for(i = 0; i < 600; i += 20) {
577
		context.moveTo(i, 0);
578
		context.lineTo(i, 600);
579
		context.moveTo(0, i);
580
		context.lineTo(600, i);
581
	}
582
	context.stroke();			
583
	// Draw drawing line				
584
	if(drawlinekind == 1) {
585
		drawline(drawlinesx, drawlinesy, drawlinedx, drawlinedy, "#000", 1.0);
586
	}
587
	// Prepare model objects
588
	for(i = 0; i < Identifiers.length; i++){
589
		var objid = Identifiers[i];
590
		prepareobj(objid);
591
	}
592
	// Draw model objects
593
	for(i = 0; i < Identifiers.length; i++){
594
		var objid = Identifiers[i];
595
		drawobj(objid);
596
	}								
597
	// Draw Crosshair
598
	context.beginPath();
599
	context.strokeStyle = '#444';
600
	context.lineWidth   = 1.0;
601
	context.moveTo(gridx - gridsize, gridy);
602
	context.lineTo(gridx + gridsize, gridy);
603
	context.moveTo(gridx, gridy - gridsize);
604
	context.lineTo(gridx, gridy + gridsize);
605
	context.stroke();											
606
	context.strokeStyle = '#ddd';
607
	context.fillStyle = '#000';
608
	context.font = "bold 16px Arial";
609
	context.textAlign = "left";
610
	context.fillText("currop: " + printstr, 20, 576);
611
	setTimeout("foo();", 100);
612
}