1 (function(global){	// BEGIN CLOSURE
  2 
  3 var Joint = global.Joint,
  4      Element = Joint.dia.Element,
  5      point = Joint.point;
  6 
  7 /**
  8  * @name Joint.dia.org
  9  * @namespace Holds functionality related to Org-charts.
 10  */
 11 var org = Joint.dia.org = {};
 12 
 13 /**
 14  * Predefined arrow. You are free to use this arrow as the option parameter to joint method.
 15  * @name arrow
 16  * @memberOf Joint.dia.org
 17  * @example
 18  * var arrow = Joint.dia.org.arrow;
 19  */
 20 org.arrow = {
 21     startArrow: {type: 'none'},
 22     endArrow: {type: 'none'},
 23     attrs: {"stroke-dasharray": "none", 'stroke-width': 2, stroke: 'gray' }
 24 };
 25 
 26 
 27 /**
 28  * Organizational chart member.
 29  * @methodOf Joint.dia.org
 30  */
 31 org.Member = Element.extend({
 32     object: 'Member',
 33     module: 'org',
 34     init: function(properties) {
 35         var p = Joint.DeepSupplement(this.properties, properties, {
 36             attrs: { fill: 'lightgreen', stroke: '#008e09', 'stroke-width': 2 },
 37             name: '',
 38             position: '',
 39             nameAttrs: { 'font-weight': 'bold' },
 40             positionAttrs: {},
 41             swimlaneAttrs: { 'stroke-width': 1, stroke: 'black' },
 42             labelOffsetY: 10,
 43             radius: 10,
 44             shadow: true,
 45             avatar: '',
 46             padding: 5
 47         });
 48         this.setWrapper(this.paper.rect(p.rect.x, p.rect.y, p.rect.width, p.rect.height, p.radius).attr(p.attrs));
 49         if (p.avatar) {
 50             this.addInner(this.paper.image(p.avatar, p.rect.x + p.padding, p.rect.y + p.padding, p.rect.height - 2*p.padding, p.rect.height - 2*p.padding));
 51             p.labelOffsetX = p.rect.height;
 52         }
 53         if (p.position) {
 54             var positionElement = this.getPositionElement();
 55             this.addInner(positionElement[0]);
 56             this.addInner(positionElement[1]);      // swimlane
 57         }
 58         this.addInner(this.getNameElement());
 59     },
 60     getPositionElement: function() {
 61 	var p = this.properties,
 62 	    bb = this.wrapper.getBBox(),
 63 	    t = this.paper.text(bb.x + bb.width/2, bb.y + bb.height/2, p.position).attr(p.positionAttrs || {}),
 64 	    tbb = t.getBBox();
 65 	t.translate(bb.x - tbb.x + p.labelOffsetX, bb.y - tbb.y + tbb.height);
 66         tbb = t.getBBox();
 67         var l = this.paper.path(['M', tbb.x, tbb.y + tbb.height + p.padding, 
 68                                  'L', tbb.x + tbb.width, tbb.y + tbb.height + p.padding].join(' '));
 69 	return [t, l];
 70     },
 71     getNameElement: function() {
 72 	var p = this.properties,
 73 	    bb = this.wrapper.getBBox(),
 74 	    t = this.paper.text(bb.x + bb.width/2, bb.y + bb.height/2, p.name).attr(p.nameAttrs || {}),
 75 	    tbb = t.getBBox();
 76 	t.translate(bb.x - tbb.x + p.labelOffsetX, bb.y - tbb.y + tbb.height*2 + p.labelOffsetY);
 77 	return t;
 78     }
 79 });
 80 
 81 })(this);	// END CLOSURE
 82