<?xml version="1.0" encoding="UTF-8"?>
<NeoAppBuilderPlugIn>
  <Title>FabricJS</Title>
  <Author>SinLios</Author>
  <Website>http://sinlios.com</Website>
  <EMail>info@sinlios.com</EMail>
  <Copyright>SinLios Soluciones Digitales 2019</Copyright>
  <Description>Version 3 (2019/08/19)
Wrapper for Fabric.js Canvas Library.
http://fabricjs.com

Fabric provides interactive object model on top of canvas element. Fabric also has SVG-to-canvas (and canvas-to-SVG) parser.</Description>
  <Notes>Fabric provides interactive object model on top of canvas element.
Fabric also has SVG-to-canvas (and canvas-to-SVG) parser.</Notes>
  <Icon20>fabric-20.png</Icon20>
  <Icon32>fabric-32.png</Icon32>
  <CompiledName>C:\Users\sinli\OneDrive\CloudStation\visualneo\VisualNeoWeb\Plugins\Fabric\fabric.nabp</CompiledName>
  <AutoInstall>yes</AutoInstall>
  <Code>var fabContador=0;
var fbCurrent;
var fabPan="no";
var clipboard = null;

fabric.Object.prototype.set({
    snapThreshold: 5,
    snapAngle: 5
});

function fabInitialize(containerId) {
    fabContenedor=containerId;
    var ancho= $("#"+containerId).width();
    var alto= $("#"+containerId).height();
    $("#"+containerId).html('&lt;canvas id="'+containerId+'Canvas" width="'+ancho+'" height="'+alto+'" style="width:'+ancho+'px;height:'+alto+'px"&gt;&lt;\/canvas&gt;');
    window["Canvas"+containerId] = new fabric.Canvas(containerId+"Canvas", {
      //Transparent Background.
      backgroundColor: 'rgba(255,255,255,0)',
      selectionColor: 'rgba(25,25,255,0.2)',
      selectionBorderColor: 'rgba(25,25,255,0.7)',
      preserveObjectStacking: true,
      snapAngle:15,
      selectionLineWidth: 1
    });
    window["Canvas"+containerId].centeredRotation=true;
    window["Canvas"+containerId].on('object:selected', function(){
           //La variable fabSelected guarda el objeto seleccionado en cada momento tan pronto como se selecciona.
           window["fabSelected"]=window["Canvas"+containerId].getActiveObject();
    });
    //window["Canvas"+containerId].centeredScaling=true;
}
function fabInitializeStatic(containerId) {
    var ancho= $("#"+containerId).width();
    var alto= $("#"+containerId).height();
    $("#"+containerId).html('&lt;canvas id="'+containerId+'Canvas" width="'+ancho+'" height="'+alto+'" style="width:'+ancho+'px;height:'+alto+'px"&gt;&lt;\/canvas&gt;');
    window["Canvas"+containerId] = new fabric.StaticCanvas(containerId+"Canvas", {
      //Transparent Background.
      backgroundColor: 'rgba(255,255,255,0)',
      selectionColor: 'rgba(25,25,255,0.2)',
      selectionBorderColor: 'rgba(25,25,255,0.7)',
      preserveObjectStacking: true,
      selectionLineWidth: 1
    });
    window["Canvas"+containerId].centeredRotation=true;
    window["Canvas"+containerId].on('object:selected', function(){
           //La variable fabSelected guarda el objeto seleccionado en cada momento tan pronto como se selecciona.
           window["fabSelected"]=window["Canvas"+containerId].getActiveObject();
    });
    //window["Canvas"+containerId].centeredScaling=true;
}
function fabStartPan(event) {
    if (event.button != 2) {
      return;
    }
    var x0 = event.screenX,
        y0 = event.screenY;
    function continuePan(event) {
      var x = event.screenX,
          y = event.screenY;
      if(fabPan==true){
        window["Canvas"+fbCurrent].relativePan({ x: x - x0, y: y - y0 });
      }
      x0 = x;
      y0 = y;
    }
    function stopPan(event) {
      $(window).off('mousemove', continuePan);
      $(window).off('mouseup', stopPan);
    };
    $(window).mousemove(continuePan);
    $(window).mouseup(stopPan);
    $(window).contextmenu(cancelMenu);
};
function cancelMenu() {
    $(window).off('contextmenu', cancelMenu);
    return false;
}
function fabPanning(containerId,valor){
  fbCurrent=containerId;
  if(fabPan=="no"){
    var canvasWrapper = document.getElementById(containerId);
    $(canvasWrapper).mousedown(fabStartPan);
  }
  fabPan=valor;
}
function fabSetSelected(containerId,name){
   window[name].name=name;
}
function fabNewName(containerId){
  fabContador++;
  nombre=containerId+"Object"+fabContador;
  return nombre;
}
function fabSaveAsPNG(containerId){
  window.open(window["Canvas"+containerId].toDataURL('image/png'));
}
function fabSaveAsSVG(containerId){
  var svg = window["Canvas"+containerId].toSVG();
  return svg;
}
function fabSaveAsJSON(containerId){
  var json = JSON.stringify(window["Canvas"+containerId].toJSON());
  return json;
}
function fabLoadFromJSON(containerId,json){
  window["Canvas"+containerId].clear();
  window["Canvas"+containerId].loadFromJSON(json);
  objects = window["Canvas"+containerId].getObjects();
  for (var i = 0, len = window["Canvas"+containerId].size(); i &lt; len; i++) {
       nombre="Object"+i;
       objects[i].name = nombre;
       window[nombre]=objects[i];
       fabSetSelected(containerId,nombre);
  }
  window["Canvas"+containerId].renderAll();
  window["Canvas"+containerId].calcOffset();
}
function fabGroup(containerId){
    var activegroup = window["Canvas"+containerId].getActiveGroup();
    var objectsInGroup = activegroup.getObjects();
    activegroup.clone(function(newgroup) {
        window["Canvas"+containerId].discardActiveGroup();
        objectsInGroup.forEach(function(object) {
		    window["Canvas"+containerId].remove(object);
	    });
        window["Canvas"+containerId].add(newgroup);
    });
}
function fabUngroup(containerId){
    var items = window["Canvas"+containerId].getActiveObject()._objects;
    window["Canvas"+containerId].getActiveObject()._restoreObjectsState();
    window["Canvas"+containerId].remove(window["Canvas"+containerId].getActiveObject());
    for(var i = 0; i &lt; items.length; i++) {
      window["Canvas"+containerId].add(items[i]);
    }
    window["Canvas"+containerId].renderAll();
    fabSelectAll(containerId);
    fabUnselect(containerId);
}
function fabSelectAll(containerId){
	var objs = window["Canvas"+containerId].getObjects().map(function(o) {
		return o.set('active', true);
	});
	var group = new fabric.Group(objs, {
		originX: 'center',
		originY: 'center'
	});
	window["Canvas"+containerId]._activeObject = null;
	window["Canvas"+containerId].setActiveGroup(group.setCoords()).renderAll();
}
function fabNewText(containerId,name,texto,x,y,fill,fuente,tamano,angulo){
   if(name==""){
     name=fabNewName(containerId);
   }
   window[name] = new fabric.Text(texto, {
      fill: fill,
      left: x,
      top: y,
      fontFamily: fuente,
      fontSize: tamano,
      angle:angulo
   });
   window["Canvas"+containerId].add(window[name]);
   fabSetSelected(containerId,name);
}
function fabNewInteractiveText(containerId,name,texto,x,y,fill,fuente,tamano,angulo){
   if(name==""){
     name=fabNewName(containerId);
   }
   window[name] = new fabric.IText(texto, {
      fill: fill,
      left: x,
      top: y,
      fontFamily: fuente,
      fontSize: tamano,
      angle:angulo
   });
   window["Canvas"+containerId].add(window[name]);
   fabSetSelected(containerId,name);
}
function fabCloneSelectedObject(containerId,newName){
    if(newName==""){
        newName=fabNewName(containerId);
    }
    window[newName] = fabric.util.object.clone(window["Canvas"+containerId].getActiveObject());
    window[newName].set("top", window[newName].top+5);
    window[newName].set("left", window[newName].left+5);
    window[newName].name=newName;
    window["Canvas"+containerId].add(window[newName]);
    fabSetSelected(containerId,newName);
}
function fabCopy(containerId) {
    window["Canvas"+containerId].getActiveObject().clone(function(cloned) {
		_clipboard = cloned;
    });
}
function fabPaste(containerId) {
    // clone again, so you can do multiple copies.
	_clipboard.clone(function(clonedObj) {
		window["Canvas"+containerId].discardActiveObject();
		clonedObj.set({
			left: clonedObj.left + 10,
			top: clonedObj.top + 10,
			evented: true,
		});
		if (clonedObj.type === 'activeSelection') {
			// active selection needs a reference to the canvas.
			clonedObj.canvas = canvas;
			clonedObj.forEachObject(function(obj) {
				canvas.add(obj);
			});
			// this should solve the unselectability
			clonedObj.setCoords();
		} else {
			window["Canvas"+containerId].add(clonedObj);
		}
		_clipboard.top += 10;
		_clipboard.left += 10;
		window["Canvas"+containerId].setActiveObject(clonedObj);
		window["Canvas"+containerId].requestRenderAll();
	});
    window["Canvas"+containerId].renderAll();
}
function fabLoadImage(containerId,name,url,x,y){
    if(name==""){
       name=fabNewName(containerId);
    }
    var imgObj = new Image();
    imgObj.src = url;
    imgObj.onload = function () {
       window[name] = new fabric.Image(imgObj);
       window[name].set({
            top: y,
            left: x
       });
       window["Canvas"+containerId].add(window[name]);
       window["Canvas"+containerId].renderAll();
     }
}
function fabNewRect(containerId,name,x,y,width,height,fill){
  if(name==""){
     name=fabNewName(containerId);
  }
  window[name] = new fabric.Rect({
    left: x,
    top: y,
    fill: fill,
    width: width,
    height: height
  });
  window[name].name=name;
  window["Canvas"+containerId].add(window[name]);
  fabSetSelected(containerId,name);
}
function fabNewPath(containerId,name,path,x,y,fill){
  if(name==""){
     name=fabNewName(containerId);
  }
  window[name] = new fabric.Path(path);
  window[name].set({ left: x, top: y, fill: fill });
  window[name].name=name;
  window["Canvas"+containerId].add(window[name]);
  fabSetSelected(containerId,name);
}
function fabNewLine(containerId,name,x1,y1,x2,y2,strokeWidth,strokeColor){
  if(name==""){
     name=fabNewName(containerId);
  }
  window[name] =  new fabric.Line([x1, y1, x2, y2], {
        strokeWidth: strokeWidth,
        stroke: strokeColor
  });
  window["Canvas"+containerId].add(window[name]);
  fabSetSelected(containerId,name);
}
function fabNewCircle(containerId,name,x,y,radius,fill){
  if(name==""){
     name=fabNewName(containerId);
  }
  window[name] = new fabric.Circle({
    radius: radius, fill: fill, left: x, top: y
  });
  window["Canvas"+containerId].add(window[name]);
  fabSetSelected(containerId,name);
}
function fabSetShadow(containerId,name,theColor,despX,despY,theBlur){
  if(name==""){
     window["fabSelected"].setShadow({
        color: theColor,
        offsetX: despX,
        offsetY: despY,
        blur: theBlur
     });
  }else{
     window[name].setShadow({
        color: theColor,
        offsetX: despX,
        offsetY: despY,
        blur: theBlur
     });
  }
  window["Canvas"+containerId].renderAll();
}
function fabAnimate(containerId,name,animation,duration,easing){
   ease=fabric.util.ease.easeOutCubic;
   if(easing!=""){
        ease=fabric.util.ease[easing];
   }
   if(name==""){
      window["fabSelected"].animate(animation, {
        duration: duration,
        onChange: window["Canvas"+containerId].renderAll.bind(window["Canvas"+containerId]),
        easing: ease
      });
   }else{
      window[name].animate(animation, {
        duration: duration,
        onChange: window["Canvas"+containerId].renderAll.bind(window["Canvas"+containerId]),
        easing: ease
      });
   }
   window["Canvas"+containerId].renderAll();
}
function fabSetFill(containerId,name,value){
  if(name==""){
     window["fabSelected"].set({ fill: value });
  }else{
     window[name].set({ fill: value });
  }
  window["Canvas"+containerId].renderAll();
}
function fabBringToFront(containerId,name){
  if(name==""){
     window["fabSelected"].bringToFront(window[name]);
  }else{
     window[name].bringToFront(window[name]);
  }
}
function fabSendToBack(containerId,name){
  if(name==""){
     window["fabSelected"].sendToBack(window[name]);
  }else{
     window[name].sendToBack(window[name]);
  }
}
function fabScale(containerId,name,escala){
  if(name==""){
     window["fabSelected"].scale(parseFloat(escala)).setCoords();
  }else{
     window[name].scale(parseFloat(escala)).setCoords();
  }
  window["Canvas"+containerId].renderAll();
}

function fabCenterObject(containerId,name){
  if(name==""){
     window["fabSelected"].center();
     window["fabSelected"].setCoords();
  }else{
     window[name].center();
     window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}

function fabCenterObjectHorizontal(containerId,name){
  if(name==""){
     window["fabSelected"].centerH();
     window["fabSelected"].setCoords();
  }else{
     window[name].centerH();
     window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabCenterObjectVertical(containerId,name){
  if(name==""){
     window["fabSelected"].centerV();
     window["fabSelected"].setCoords();
  }else{
     window[name].centerV();
     window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}

function fabClear(containerId){
  window["Canvas"+containerId].clear();
  window["Canvas"+containerId].renderAll();
}

function fabRemove(containerId,name){
  if(name==""){
     window["Canvas"+containerId].remove(window["Canvas"+containerId].getActiveObject());
  }else{
     window["Canvas"+containerId].remove(window[name]);
  }
}
function fabSetActiveObject(containerId,name){
  if(name==""){
    return
  }else{
    window["Canvas"+containerId].setActiveObject(window[name]);
  }
}
function fabSetBgColor(containerId,color){
  window["Canvas"+containerId].setBackgroundColor(color);
  window["Canvas"+containerId].renderAll();
}
function fabUnselect(containerId){
  window["Canvas"+containerId].discardActiveObject();
  window["Canvas"+containerId].renderAll();
}
function fabSetZoom(containerId,zoom){
  window["Canvas"+containerId].setZoom(zoom);
  window["Canvas"+containerId].renderAll();
}
function fabZoomToPoint(containerId,zoom,x,y){
  punto=new fabric.Point(x,y);
  window["Canvas"+containerId].zoomToPoint(punto);
  window["Canvas"+containerId].renderAll();
}
function fabPanTo(containerId,x,y){
  punto=new fabric.Point(x,y);
  window["Canvas"+containerId].absolutePan(punto);
}
function fabRelativePan(containerId,offsetX,offsetY){
  punto=new fabric.Point(offsetX,offsetY);
  window["Canvas"+containerId].relativePan(punto);
}
function fabGetProperty(containerId,name,property){
  if(name==""){
     resultado=window["fabSelected"].get(property);
  }else{
     resultado=window[name].get(property);
  }
  return resultado;
}
function fabSetProperty(containerId,name,property,valor){
  if(name==""){
     resultado=window["fabSelected"].set(property,valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set(property,valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSet(containerId,name,objeto){
  if(name==""){
     resultado=window["fabSelected"].set(objeto);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set(objeto);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabOriginX(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].originX=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].originX=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabOriginY(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].originY=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].originY=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabScaleToWidth(containerId,name,anchura){
  if(name==""){
     resultado=window["fabSelected"].scaleToWidth(anchura);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].scaleToWidth(anchura);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabScaleToHeight(containerId,name,altura){
  if(name==""){
     resultado=window["fabSelected"].scaleToHeight(altura);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].scaleToHeight(altura);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetLeft(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("left",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("left",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetTop(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("top",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("top",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetOpacity(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("opacity",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("opacity",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetStrokeColor(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("stroke",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("stroke",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetStrokeWidth(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("strokeWidth",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("strokeWidth",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSetTextAlign(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].textAlign=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].textAlign=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSelectable(containerId,name,valor){
  window["Canvas"+containerId].discardActiveObject();
  if(name==""){
     resultado=window["fabSelected"].selectable=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].selectable=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabHasControls(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].hasControls=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].hasControls=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabHasBorders(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].hasBorders=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].hasBorders=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabHasRotatingPoint(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].hasRotatingPoint=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].hasRotatingPoint=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabFlipX(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("flipX",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("flipX",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabFlipY(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].set("flipY",valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].set("flipY",valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabLockMovementX(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].lockMovementX=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].lockMovementX=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabLockMovementY(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].lockMovementY=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].lockMovementY=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabLockRotation(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].lockRotation=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].lockRotation=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabLockScaling(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].lockScalingY=valor;
     resultado=window["fabSelected"].lockScalingX=valor;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].lockScalingY=valor;
     resultado=window[name].lockScalingX=valor;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabAddEvent(containerId,name,evento,funcion){
     var neoApp = angular.element(document.getElementById("ng-view")).scope();
     if(name==""){
        window["fabSelected"].on(evento, funcion);
     }else{
        window[name].on(evento, funcion);
     }
}
function fabDrawingMode(containerId,valor,elcolor,elwidth){
  window["Canvas"+containerId].freeDrawingBrush.color=elcolor;
  window["Canvas"+containerId].freeDrawingBrush.width=elwidth;
  window["Canvas"+containerId].isDrawingMode=valor;
  window["Canvas"+containerId].renderAll();
}
function fabSaveLocal(containerId,name){
  if(!window.localStorage){alert("Not supported on this browser."); return;}
  var json = JSON.stringify(window["Canvas"+containerId]);
  window.localStorage.setItem(name, json);
}
function fabLoadLocal(containerId,thename){
    if(!window.localStorage){alert("Not supported on this browser."); return;}
    window["Canvas"+containerId].clear();
    window["Canvas"+containerId].loadFromJSON(window.localStorage.getItem(thename));
    objects = window["Canvas"+containerId].getObjects();
    for (var i = 0, len = window["Canvas"+containerId].size(); i &lt; len; i++) {
       nombre="Object"+i;
       objects[i].name = nombre;
       window[nombre]=objects[i];
       fabSetSelected(containerId,nombre);
    }
    window["Canvas"+containerId].renderAll();
    window["Canvas"+containerId].calcOffset();
}
function fabDeleteLocal(name){
    if(!window.localStorage){alert("Not supported on this browser."); return;}
    window.localStorage.removeItem(name);
}
function fabFontFamily(containerId,name,fuente){
  if(name==""){
     resultado=window["fabSelected"].fontFamily=fuente;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].fontFamily=fuente;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabFontSize(containerId,name,size){
  if(name==""){
     resultado=window["fabSelected"].fontSize=size;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].fontSize=size;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabFontStyle(containerId,name,style){
  if(name==""){
     resultado=window["fabSelected"].fontStyle=style;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].fontStyle=style;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabFontWeight(containerId,name,weight){
  if(name==""){
     resultado=window["fabSelected"].fontWeight=weight;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].fontWeight=weight;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabTextAlign(containerId,name,align){
  if(name==""){
     resultado=window["fabSelected"].textAlign=align;
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].textAlign=align;
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
}
function fabSavePDF(containerId,name){
    //Necesita jsPDF y FileSaver.js
    window["Canvas"+containerId].renderAll();
    var doc = new jsPDF();
    
    var base64 = window["Canvas"+containerId].toDataURL('image/jpg');
    
    doc.addImage(base64, 'JPEG', 0, 0);
    var data = doc.output();
    var buffer = new ArrayBuffer(data.length);
    var array = new Uint8Array(buffer);
    for (var i = 0; i &lt; data.length; i++) {
        array[i] = data.charCodeAt(i);
    }
    var blob = new Blob(
        [array],
        {type: 'application/pdf', encoding: 'raw'}
    );
    saveAs(blob, name);
    window["Canvas"+containerId].renderAll();
}
function fabToggle(containerId,name,valor){
  if(name==""){
     resultado=window["fabSelected"].toggle(valor);
     resultado=window["fabSelected"].setCoords();
  }else{
     resultado=window[name].toggle(valor);
     resultado=window[name].setCoords();
  }
  window["Canvas"+containerId].renderAll();
};

var fabElNombre;
function fabLoadSVGFromString(containerId,name,svgStr,x,y){
  if(name==""){
     fabElNombre=fabNewName(containerId);
  }else{
     fabElNombre=name;
  }
  var path = fabric.loadSVGFromString(svgStr,function(objects, options) {
    window[fabElNombre] = fabric.util.groupSVGElements(objects, options);
    window[fabElNombre].set({ left:x, top:y});
    window[fabElNombre].setCoords();
    window["Canvas"+containerId].add(window[fabElNombre]).renderAll();
  });
  //fabSetSelected(containerId,name);
};

function fabIntersectsWith(name1,name2){
  window[name1].setCoords();
  window[name2].setCoords();
  return window[name1].intersectsWithObject(window[name2])
};


//***********************************************************************************************
//
//                         ORGANIZATION CHART CAPABILITIES
//
//***********************************************************************************************

fabContenedor="";
fabLineColor="#ff0000";
function fabInitializeOrgChart(containerId) {
    fabContenedor=containerId;
    var ancho= $("#"+containerId).width();
    var alto= $("#"+containerId).height();
    $("#"+containerId).html('&lt;canvas id="'+containerId+'Canvas" width="'+ancho+'" height="'+alto+'" style="width:'+ancho+'px;height:'+alto+'px"&gt;&lt;\/canvas&gt;');
    window["Canvas"+containerId] = new fabric.Canvas(containerId+"Canvas", {
      //Transparent Background.
      backgroundColor: 'rgba(255,255,255,0)',
      selectionColor: 'rgba(25,25,255,0.2)',
      selectionBorderColor: 'rgba(25,25,255,0.7)',
      selectionLineWidth: 1
    });
    window["Canvas"+containerId].centeredRotation=true;
    window["Canvas"+containerId].on('object:selected', function(){
           //La variable fabSelected guarda el objeto seleccionado en cada momento tan pronto como se selecciona.
           window["fabSelected"]=window["Canvas"+containerId].getActiveObject();
    });
    fabAddChildMoveLine('object:selected');
    fabAddChildMoveLine('object:scaling');
    fabAddChildMoveLine('object:moving');
    //window["Canvas"+containerId].centeredScaling=true;
}
window.fabAddChild = function(elcolor){
    if(elcolor!=undefined){
       fabLineColor=elcolor;
    }
    window["Canvas"+fabContenedor].fabAddChild = {
        start: window["Canvas"+fabContenedor].getActiveObject()
    };
    window["Canvas"+fabContenedor].off('object:selected', fabAddChildLine);
    window["Canvas"+fabContenedor].on('object:selected', fabAddChildLine);
};

function fabAddChildLine(options){
    window["Canvas"+fabContenedor].off('object:selected', fabAddChildLine);
    var fromObject = window["Canvas"+fabContenedor].fabAddChild.start;
    var toObject = options.target;
    var from = fromObject.getCenterPoint();
    var to = toObject.getCenterPoint();
    var line = new fabric.Line([from.x, from.y, to.x, to.y], {
        fill: fabLineColor,
        stroke: fabLineColor,
        strokeWidth: 5,
        selectable: false
    });
    window["Canvas"+fabContenedor].add(line);
    line.sendToBack();
    fromObject.fabAddChild = {
        from: (fromObject.fabAddChild &amp;&amp; fromObject.fabAddChild.from) || [],
        to: (fromObject.fabAddChild &amp;&amp; fromObject.fabAddChild.to)
    };
    fromObject.fabAddChild.from.push(line);
    toObject.fabAddChild = {
        from: (toObject.fabAddChild &amp;&amp; toObject.fabAddChild.from),
        to: (toObject.fabAddChild &amp;&amp; toObject.fabAddChild.to) || []
    };
    toObject.fabAddChild.to.push(line);
    line.fabAddChildRemove = function() {
        fromObject.fabAddChild.from.forEach(function(e, i, arr) {
            if (e === line)
                arr.splice(i, 1);
        });
        toObject.fabAddChild.to.forEach(function(e, i, arr) {
            if (e === line)
                arr.splice(i, 1);
        });
    };
    window["Canvas"+fabContenedor].fabAddChild = undefined;
};

function fabAddChildMoveLine(event){
    window["Canvas"+fabContenedor].on(event, function(options) {
        var object = options.target;
        var objectCenter = object.getCenterPoint();
        if (object.fabAddChild) {
            if (object.fabAddChild.from)
                object.fabAddChild.from.forEach(function(line) {
                    line.set({ 'x1': objectCenter.x, 'y1': objectCenter.y });
                });
                if (object.fabAddChild.to)
                    object.fabAddChild.to.forEach(function(line) {
                        line.set({ 'x2': objectCenter.x, 'y2': objectCenter.y });
                    });
        }

        window["Canvas"+fabContenedor].renderAll();
    });
};

window.fabDeleteObject = function () {
    var object = window["Canvas"+fabContenedor].getActiveObject();
    if (object.fabAddChild) {
        if (object.fabAddChild.from)
            for (var i = object.fabAddChild.from.length - 1; i &gt;= 0; i--) {
                var line = object.fabAddChild.from[i];
                line.fabAddChildRemove();
                line.remove();
            };
        if (object.fabAddChild.to)
            for (var i = object.fabAddChild.to.length - 1; i &gt;= 0; i--) {
                var line = object.fabAddChild.to[i];
                line.fabAddChildRemove();
                line.remove();
            };
    }
    object.remove();
};

</Code>
  <Files>
    <File>C:\Users\sinli\OneDrive\CloudStation\visualneo\VisualNeoWeb\Plugins\Fabric\fabric.js-3.2\fabric.min.js</File>
  </Files>
  <ActionList>
    <Action Name="fabAddEvent">
      <Hint>Adds an event to an Object.
</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;evento|ENUMLIST=added,removed,selected,deselected,modified,modified,moved,scaled,rotated,skewed,rotating,scaling,moving,skewing,mousedown,mouseup,mouseover,mouseout,mousewheel,mousedblclick,dragover,dragenter,dragleave,drop|Event Name;funcion|FUNCTION|Function name to call when event fires</Params>
      <Template>fabAddEvent(containerId,name,evento,funcion);</Template>
    </Action>
    <Action Name="fabAnimate">
      <Hint>Animates object's properties </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;animation|VARREF|Animation description (ie:{left:100,top:100,angle:'+=180'} or CSS object);duration|INTEGER|Duration in milliseconds;"easing|ENUMLIST=easeInQuad,easeOutQuad,easeInOutQuad,easeInCubic,easeOutCubic,easeInOutCubic,easeInQuart,easeOutQuart,easeInOutQuart,easeInQuint,easeOutQuint,easeInOutQuint,easeInSine,easeOutSine,easeInOutSine,easeInExpo,easeOutExpo,easeInOutExpo,easeInCirc,easeOutCirc,easeInOutCirc,easeInElastic,easeOutElastic,easeInOutElastic,easeInBack,easeOutBack,easeInOutBack,easeInBounce,easeInOutBounce,""easeOutBounce  ""|Easing"</Params>
      <Template>fabAnimate(containerId,name,animation,duration,easing);</Template>
    </Action>
    <Action Name="fabBringToFront">
      <Hint>Bring to front to an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabBringToFront(containerId,name);</Template>
    </Action>
    <Action Name="fabCenterObject">
      <Hint>Centers in canvas an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabCenterObject(containerId,name);</Template>
    </Action>
    <Action Name="fabCenterObjectHorinzontal">
      <Hint>Centers horizontally in canvas an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabCenterObjectHorizontal(containerId,name);</Template>
    </Action>
    <Action Name="fabCenterObjectVertical">
      <Hint>Centers vertically in canvas an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabCenterObjectVertical(containerId,name);</Template>
    </Action>
    <Action Name="fabClear">
      <Hint>Clear the canvas</Hint>
      <Params>containerId|STRING|Select an initializazed Container Object</Params>
      <Template>fabClear(containerId);</Template>
    </Action>
    <Action Name="fabCloneSelectedObject">
      <Params>containerId|OBJID|Select an initializazed Container Object;newName|STRING|Name for the new object</Params>
      <Template>fabCloneSelectedObject(containerId,newName);</Template>
    </Action>
    <Action Name="fabDeleteLocal">
      <Hint>Deletes a previously saved local image</Hint>
      <Params>name|STRING|Image name (ie:mydrawing)</Params>
      <Template>fabDeleteLocal(name);</Template>
    </Action>
    <Action Name="fabDrawingMode">
      <Hint>Turns on or off the freehand drawing mode.</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;valor|BOOLEAN|Drawing mode (true or false);elcolor|STRING|Line color (ie: #ff0000);elwidth|FLOAT|Line width</Params>
      <Template>fabDrawingMode(containerId,valor,elcolor,elwidth);</Template>
    </Action>
    <Action Name="fabFontFamily">
      <Hint>Changes the font family in a Text Object</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;fuente|STRING|Font Family</Params>
      <Template>fabFontFamily(containerId,name,fuente);</Template>
    </Action>
    <Action Name="fabFontSize">
      <Hint>Changes the Font size (in pixels) </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;size|INTEGER|Font Size</Params>
      <Template>fabFontSize(containerId,name,size);</Template>
    </Action>
    <Action Name="fabFontStyle">
      <Hint>Font style. Possible values: "", "normal", "italic" or "oblique".</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;style|ENUMLIST=normal,italic,oblique|Font Style</Params>
      <Template>fabFontStyle(containerId,name,style);</Template>
    </Action>
    <Action Name="fabFontWeight">
      <Hint>Font weight (ie: bold, normal)</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;weight|ENUMLIST=normal,bold|Font Weight</Params>
      <Template>fabFontWeight(containerId,name,weight);</Template>
    </Action>
    <Action Name="fabFlipX">
      <Hint>When true, object is fliped horizontally </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|BOOLEAN|FlipX (true or false)</Params>
      <Template>fabFlipX(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabFlipY">
      <Hint>When true, object is fliped vertically </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|BOOLEAN|FlipY (true or false)</Params>
      <Template>fabFlipY(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabGetProperty">
      <Hint>Gets an object property value</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;property|STRING|Property name;result|VARREF|Variable to store the result</Params>
      <Template>result=fabGetProperty(containerId,name,property);</Template>
    </Action>
    <Action Name="fabHasBorders">
      <Hint>When set to false, object's controlling borders are not rendered</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|BOOLEAN|Has Borders (true or false)</Params>
      <Template>fabHasBorders(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabHasControls">
      <Hint>When set to 'false', object's controls are not displayed and can not be used to manipulate object </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Has controls (true or false)</Params>
      <Template>fabHasControls(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabInitialize">
      <Hint>Initializes the library on a container object</Hint>
      <Params>containerId|OBJID|Select a Container Object from your App</Params>
      <Template>fabInitialize(containerId);</Template>
    </Action>
    <Action Name="fabInitializeOrgChart">
      <Hint>Initializes the library on a container Object with Org Chart Capabilities</Hint>
      <Params>containerId|OBJID|Select a Container Object from your App</Params>
      <Template>fabInitializeOrgChart(containerId);</Template>
    </Action>
    <Action Name="fabInitializeStatic">
      <Hint>Initializes the library on a container Object without interactivity layer</Hint>
      <Params>containerId|OBJID|Select a Container Object from your App</Params>
      <Template>fabInitializeStatic(containerId);</Template>
    </Action>
    <Action Name="fabIntersectsWith">
      <Params>resultado|VARREF|Var to store the result;name1|STRING|Object 1 name;name2|STRING|Object 2 name</Params>
      <Template>resultado=fabIntersectsWith(name1,name2);</Template>
    </Action>
    <Action Name="fabLoadImage">
      <Hint>Loads an image from a URL</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Image name;url|FILEPATH|Image URL and file name;x|INTEGER|Left position;y|INTEGER|Top position</Params>
      <Template>fabLoadImage(containerId,name,url,x,y);</Template>
    </Action>
    <Action Name="fabLoadFromJSON">
      <Params>containerId|OBJID|Select an initializazed Container Object;json|STRING|JSON string</Params>
      <Template>fabLoadFromJSON(containerId,json);</Template>
    </Action>
    <Action Name="fabLoadLocal">
      <Hint>Loads a previously saved local image</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Image name (ie:mydrawing)</Params>
      <Template>fabLoadLocal(containerId,name);</Template>
    </Action>
    <Action Name="fabLoadSVGFromString">
      <Hint>Loads a SVG image from a URL</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Image name;svgstring|HTML|SVG string;x|INTEGER|Left position;y|INTEGER|Top position</Params>
      <Template>fabLoadSVGFromString(containerId,name,svgstring,x,y);</Template>
    </Action>
    <Action Name="fabLockMovementX">
      <Hint>When true, object horizontal movement is locked </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Lock Movement X (true or false)</Params>
      <Template>fabLockMovementX(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabLockMovementY">
      <Hint>When true, object vertical movement is locked </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Lock Movement X (true or false)</Params>
      <Template>fabLockMovementY(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabLockRotation">
      <Hint>When true, object rotation is locked </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Lock Rotation (true or false)</Params>
      <Template>fabLockRotation(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabLockScaling">
      <Hint>When true, object scaling is locked </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Lock Scaling (true or false)</Params>
      <Template>fabLockScaling(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabNewCircle">
      <Hint>Add a circle</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Circle name;x|INTEGER|Left position;y|INTEGER|Top position;radius|INTEGER|Circle radius;fill|STRING|Fill color. Ex: #ff0000</Params>
      <Template>fabNewCircle(containerId,name,x,y,radius,fill);</Template>
    </Action>
    <Action Name="fabNewLine">
      <Hint>Adds a line</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Line name;x1|INTEGER|X1 Left origin position;y1|INTEGER|Y1 Top origin position;x2|INTEGER|X2 Left destination position;y2|INTEGER|Y2 Top destination position;strokeWidth|INTEGER|Stroke Width;strokeColor|STRING|Stroke Color ie:#ff0000</Params>
      <Template>fabNewLine(containerId,name,x1,y1,x2,y2,strokeWidth,strokeColor)</Template>
    </Action>
    <Action Name="fabNewPath">
      <Hint>Adds a path</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Rectangle Name;path|STRING|Path to draw (ie: 'M 0 0 L 200 100 L 170 200 z');x|INTEGER|Left position;y|INTEGER|Top position;fill|STRING|Fill color Ex: #ff0000</Params>
      <Template>fabNewPath(containerId,name,path,x,y,fill);</Template>
    </Action>
    <Action Name="fabNewRect">
      <Hint>Adds a rectangle</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Rectangle Name;x|INTEGER|Left position;y|INTEGER|Top position;width|INTEGER|Rectangle width;height|INTEGER|Rectangle Height;fill|STRING|Fill color Ex: #ff0000</Params>
      <Template>fabNewRect(containerId,name,x,y,width,height,fill);</Template>
    </Action>
    <Action Name="fabNewText">
      <Hint>Adds a new text</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Text name;texto|STRING|Text to write;x|INTEGER|Left position;y|INTEGER|Top position;fill|STRING|Fill color. Ex: #ff0000;fuente|STRING|Font Family (ie:Georgia);tamano|INTEGER|Font Size (ie:20);angulo|INTEGER|Angle (ie:45)</Params>
      <Template>fabNewText(containerId,name,texto,x,y,fill,fuente,tamano,angulo);</Template>
    </Action>
    <Action Name="fabNewInteractiveText">
      <Hint>Adds a new interactive (user editable) text</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Text name;texto|STRING|Text to write;x|INTEGER|Left position;y|INTEGER|Top position;fill|STRING|Fill color. Ex: #ff0000;fuente|STRING|Font Family (ie:Georgia);tamano|INTEGER|Font Size (ie:20);angulo|INTEGER|Angle (ie:45)</Params>
      <Template>fabNewInteractiveText(containerId,name,texto,x,y,fill,fuente,tamano,angulo);</Template>
    </Action>
    <Action Name="fabOriginX">
      <Hint>Horizontal origin of transformation of an object (one of "left", "right", "center")</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Text name;valor|STRING|Origin X (left,center,right)</Params>
      <Template>fabOriginX(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabOriginY">
      <Hint>Vertical origin of transformation of an object (one of "top", "bottom", "center")</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Text name;valor|STRING|Origin Y (top,center,bottom)</Params>
      <Template>fabOriginY(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabPanTo">
      <Hint>Pans the canvas to a specific absolute point</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;x|INTEGER|X position;y|INTEGER|Y position</Params>
      <Template>fabPanTo(containerId,x,y);</Template>
    </Action>
    <Action Name="fabPanning">
      <Hint>Turns On or Off  panning with mouse right button</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;valor|BOOLEAN|Pan when dragging with mouse right button</Params>
      <Template>fabPanning(containerId,valor);</Template>
    </Action>
    <Action Name="fabRelativePan">
      <Hint>Pans the canvas by an offset distance in both axis</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;offsetX|INTEGER|X Offset;offsetY|INTEGER|Y Offset</Params>
      <Template>fabRelativePan(containerId,offsetX,offsetY);</Template>
    </Action>
    <Action Name="fabRemove">
      <Hint>Removes an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabRemove(containerId,name);</Template>
    </Action>
    <Action Name="fabSaveAsJSON">
      <Params>containerId|OBJID|Select an initializazed Container Object;mivar|VARREF|Variable to store the result</Params>
      <Template>mivar= fabSaveAsJSON(containerId);</Template>
    </Action>
    <Action Name="fabSaveAsPNG">
      <Hint>Saves the canvas as a PNG image file with background transparency</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object</Params>
      <Template>fabSaveAsPNG(containerId);</Template>
    </Action>
    <Action Name="fabSaveAsSVG">
      <Hint>Saves the canvas as a SVG image file into a variable</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;mivar|VARREF|Variable to store the result</Params>
      <Template>mivar= fabSaveAsSVG(containerId);</Template>
    </Action>
    <Action Name="fabSaveLocal">
      <Hint>Save a copy on the local system</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Image name (ie:mydrawing)</Params>
      <Template>fabSaveLocal(containerId,name);</Template>
    </Action>
    <Action Name="fabScale">
      <Hint>Sets the scale to an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;escala|FLOAT|Scale (ie:0.25)</Params>
      <Template>fabScale(containerId,name,escala);</Template>
    </Action>
    <Action Name="fabSavePDF">
      <Hint>Saves de image as PDF (needs jsPDF and FileSaver.js libraries to be loaded)</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|PDF file name</Params>
      <Template>fabSavePDF(containerId,name);</Template>
    </Action>
    <Action Name="fabScaleToHeight">
      <Hint>Scales an object to a given height, with respect to bounding box (scaling by x/y equally) </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;altura|FLOAT|Height</Params>
      <Template>fabScaleToHeight(containerId,name,altura);</Template>
    </Action>
    <Action Name="fabScaleToWidth">
      <Hint>Scales an object to a given width, with respect to bounding box (scaling by x/y equally) </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;anchura|FLOAT|Width</Params>
      <Template>fabScaleToWidth(containerId,name,anchura);</Template>
    </Action>
    <Action Name="fabSelectable">
      <Hint>Sets the selectable property of an object</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Selectable (true or false)</Params>
      <Template>fabSelectable(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSendToBack">
      <Hint>Sends to back to an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name</Params>
      <Template>fabSendToBack(containerId,name);</Template>
    </Action>
    <Action Name="fabSet">
      <Hint>Sets many properties on one single action</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;objeto|VARREF|Properties. ie: {top:0,left:10,angle:90} or CSS object</Params>
      <Template>fabSet(containerId,name,objeto);</Template>
    </Action>
    <Action Name="fabSetActiveObject">
      <Hint>Sets an object active by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name (mandatory)</Params>
      <Template>fabSetActiveObject(containerId,name);</Template>
    </Action>
    <Action Name="fabSetBgColor">
      <Hint>Sets the canvas background color</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;color|STRING|Color value (ie: #ff0000)</Params>
      <Template>fabSetBgColor(containerId,color);</Template>
    </Action>
    <Action Name="fabSetFill">
      <Hint>Sets the fill color for any object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Name of the object to fill. Left empty for currently selected object;value|STRING|Color value (ie: #ff0000)</Params>
      <Template>fabSetFill(containerId,name,value);</Template>
    </Action>
    <Action Name="fabSetLeft">
      <Hint>Sets object's left position</Hint>
      <Params>containerId|STRING|Select an initializazed Container Object;name|STRING|Object name;valor|FLOAT|Left distance</Params>
      <Template>fabSetLeft(containerId,name,valor)</Template>
    </Action>
    <Action Name="fabSetOpacity">
      <Hint>Sets object's opacity</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|FLOAT|Opacity value (0-1)</Params>
      <Template>fabSetOpacity(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetProperty">
      <Hint>Set any property value</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;property|ENUMLIST=angle,left,top,skewX,skewY,scaleX,scaleY,scale,backgroundColor,fill,borderColor,centeredRotation,centeredScaling,flipX,flipY,height,width,hoverCursor,,|Property name;valor|STRING|Property value</Params>
      <Template>fabSetProperty(containerId,name,property,valor);</Template>
    </Action>
    <Action Name="fabSetNumericalProperty">
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;property|ENUMLIST=angle,height,left,opacity,padding,scaleX,scaleY,skewX,skewY,strokeWidth,top,width|Property name;valor|FLOAT|Property value</Params>
      <Template>fabSetProperty(containerId,name,property,valor);</Template>
    </Action>
    <Action Name="fabRotatingPointPoint">
      <Hint>When set to false, object's controlling rotating point will not be visible or selectable </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Objects name;valor|BOOLEAN|Has Rotating Point (true or false)</Params>
      <Template>fabHasRotatingPoint(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetShadow">
      <Hint>Sets a shadow to an object selected on canvas or by its name</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;theColor|STRING|Shadow color (ie:#000000);despX|INTEGER|X offset in pixels;despY|INTEGER|Y offset in pixels;theBlur|INTEGER|Blur (ie:10)</Params>
      <Template>fabSetShadow(containerId,name,theColor,despX,despY,theBlur);</Template>
    </Action>
    <Action Name="fabSetStrokeColor">
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|STRING|Stroke color (ie:#ff0000)</Params>
      <Template>fabSetStrokeColor(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetStrokeWidth">
      <Hint>Sets object's strokeWidth</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|FLOAT|Stroke width</Params>
      <Template>fabSetStrokeWidth(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetTextAlign">
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|STRING|left, right, center or justify</Params>
      <Template>fabSetTextAlign(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetTop">
      <Hint>Sets object's top position</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|FLOAT|Top distance</Params>
      <Template>fabSetTop(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabSetZoom">
      <Hint>Sets the Canvas Zoom</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;zoom|FLOAT|Zoom factor (ie:1.5)</Params>
      <Template>fabSetZoom(containerId,zoom);</Template>
    </Action>
    <Action Name="fabTextAlign">
      <Hint>Text alignment. Possible values: "left", "center", "right" or "justify". </Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;align|STRING|Alignment.(left,center,right or justify</Params>
      <Template>fabTextAlign(containerId,name,align);</Template>
    </Action>
    <Action Name="fabToggle">
      <Hint>Toggles a boolean property from true to false or viceversa</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;name|STRING|Object name;valor|STRING|Boolean property to toggle</Params>
      <Template>fabToggle(containerId,name,valor);</Template>
    </Action>
    <Action Name="fabUnselect">
      <Hint>Deactivate all selected objects</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object</Params>
      <Template>fabUnselect(containerId);</Template>
    </Action>
    <Action Name="fabZoomToPoint">
      <Hint>Zoom the canvas centered in a given point</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object;zoom|FLOAT|Zoom factor (ie:1.5);x|INTEGER|X point coordinate;y|INTEGER|Y point coordinate</Params>
      <Template>fabZoomToPoint(containerId,zoom,x,y);</Template>
    </Action>
    <Action Name="fabCopy">
      <Hint>Copy</Hint>
      <Params>containerId|OBJID|Select an initializazed Container Object</Params>
      <Template>fabCopy(containerId);</Template>
    </Action>
    <Action Name="fabPaste">
      <Hint>Paste</Hint>
      <Params>containerId|STRING|Select an initializazed Container Object</Params>
      <Template>fabPaste(containerId);</Template>
    </Action>
    <Action Name="fabGroup">
      <Hint>Group</Hint>
      <Params>containerId|STRING|Select an initializazed Container Object</Params>
      <Template>fabGroup(containerId);</Template>
    </Action>
    <Action Name="fabUngroup">
      <Hint>Ungroup</Hint>
      <Params>containerId|STRING|Select an initializazed Container Object</Params>
      <Template>fabUngroup(containerId);</Template>
    </Action>
  </ActionList>
</NeoAppBuilderPlugIn>
