<!DOCTYPE html>
<html>

  <head>
    <script data-require="jquery@*" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
    <script src="fabricToolbar.js"></script>
  </head>

  <body>
    <h1>fabricjs, text group</h1>
    <div id="toolbar">
      <ul>
        <li data-action="addText">Text</li>
        <li data-action="scaleRandom">Random Scale</li>
      </ul>
    </div>
    <div id="my_cont" style="height: 500px; width: 500px; border: 1px dashed blue">
      <canvas id="canvas" style="border: 2px solid #ccc;box-sizing: border-box"></canvas>
    </div>
    <script src="demoSetup.js"></script>
    <script>
      var ftoolbar = new FabricToolbar();
    </script>
  </body>

</html>
// Code goes here

var $toolbar = $('#toolbar'),
    $cont = $('#my_cont'),
    $canvasEle = $('#canvas'),
    canvasF = new fabric.Canvas($canvasEle[0]);

/*************************/
/* T00LBAR ***************/
/*************************/

$toolbar.find('li').click(function(){
  
  var active = $(this).hasClass('active');
  
  active ? $(this).removeClass('active') : $(this).addClass('active');
  
  $(this).siblings().removeClass('active');
  
  canvasF.selection = active;
  
});

var toolbarActions = {
  'addText': function (evt) {
    console.log(evt);
    var text = new fabric.IText("hello pressed", $.extend(settings, {
      top: canvasF.getPointer(evt.e).y,
      left: canvasF.getPointer(evt.e).x 
    }));
    
    // set top
    text.setTop(text.top + 15 - 3.2);
    // add
    canvasF.add(text);
    
    //text.enterEditing();
  },
  'scaleRandom': function (evt) {
    scale(_.random(.3,1.7));
  }
}

canvasF.on('mouse:down', function(evt){
  var $active = $toolbar.find('.active');
  if($active.length) {
    toolbarActions[$active.attr('data-action')](evt);
    return false;
  }
});

/*************************/
/* CANVAS ****************/
/*************************/

function scale (number){
  canvasF.setZoom(number);
  canvasF.setWidth($cont.width()*number);
  canvasF.setHeight($cont.height()*number);
}

scale(1);


// add some text
var settings = {
  fill: 'black',
  fontSize: 24,
  left: 250,
  top: 250,
  fontFamily: 'arial'
}

canvasF.add(new fabric.IText("hello", settings));
canvasF.add(new fabric.IText("hello", $.extend(settings,{top: 275, left: 275 })));



/* Styles go here */

ul li { display: inline-block; border: 1px solid #ccc; cursor: pointer; padding: 5px 15px; }

ul li.active { color: #fff; background-color: black; }  
var FabricToolbar = function(settings){

  _merge({},{});

  var setup = function(){
    // apply settings
  }; 
  
  
  /************************/
  /** UTILS ***************/
  /************************/

  function _merge (o1,o2, strict) {
    if(strict) {
      _foreach(o1,function(k){
        if(o2[k]){
          o1[k] = o2[k];  
        }
      });
    }else{
      _foreach(o2,function(k){
        o1[k] = o2[k];
      });
    }
  }
  function _foreach(obj, cb) {
    Object.keys(obj).forEach(function(key) {
      cb(key);
    });
  }
  
  // create toolbar
  setup(); 
}