Repository: openmeetings
Updated Branches:
  refs/heads/master 9b53f02a4 -> 965cba711


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/965cba71/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
deleted file mode 100644
index b18a8f0..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb.js
+++ /dev/null
@@ -1,1752 +0,0 @@
-/* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
-var PRESENTER = 'presenter';
-var WHITEBOARD = 'whiteBoard';
-var NONE = 'none';
-var UUID = (function() {
-       var self = {};
-       var lut = [];
-       for (var i = 0; i < 256; i++) {
-               lut[i] = (i < 16 ? '0' : '') + (i).toString(16);
-       }
-       self.generate = function() {
-               var d0 = Math.random() * 0xffffffff | 0;
-               var d1 = Math.random() * 0xffffffff | 0;
-               var d2 = Math.random() * 0xffffffff | 0;
-               var d3 = Math.random() * 0xffffffff | 0;
-               return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 
0xff] + lut[d0 >> 24 & 0xff] + '-' +
-                       lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 
16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +
-                       lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + 
lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +
-                       lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 
0xff] + lut[d3 >> 24 & 0xff];
-       }
-       return self;
-})();
-var Player = (function() {
-       let player = {}, mainColor = '#ff6600', rad = 20;
-       function _filter(_o, props) {
-               return props.reduce((result, key) => { result[key] = _o[key]; 
return result; }, {});
-       }
-       function _sendStatus(g, _paused, _pos) {
-               g.status.paused = _paused;
-               g.status.pos = _pos;
-               wbAction('videoStatus', JSON.stringify({
-                       wbId: g.canvas.wbId
-                       , uid: g.uid
-                       , status: {
-                               paused: _paused
-                               , pos: _pos
-                       }
-               }));
-       }
-
-       player.create = function(canvas, _o, _role) {
-               let vid = $('<video>').hide().attr('class', 'wb-video slide-' + 
canvas.slide).attr('id', 'wb-video-' + _o.uid)
-                       .attr("width", _o.width).attr("height", _o.height)
-                       .append($('<source>').attr('type', 
'video/mp4').attr('src', _o._src));
-               $('#wb-tab-' + canvas.wbId).append(vid);
-               new fabric.Image.fromURL(_o._poster, function(poster) {
-                       new fabric.Image(vid[0], {}, function (video) {
-                               video.visible = false;
-                               poster.width = _o.width;
-                               poster.height = _o.height;
-                               if (typeof _o.status === 'undefined') {
-                                       _o.status = {paused: true};
-                               }
-                               let playable = false;
-                               let trg = new fabric.Triangle({
-                                       left: 2.7 * rad
-                                       , top: _o.height - 2.5 * rad
-                                       , visible: _o.status.paused
-                                       , angle: 90
-                                       , width: rad
-                                       , height: rad
-                                       , stroke: mainColor
-                                       , fill: mainColor
-                               });
-                               let rectPause1 = new fabric.Rect({
-                                       left: 1.6 * rad
-                                       , top: _o.height - 2.5 * rad
-                                       , visible: !_o.status.paused
-                                       , width: rad / 3
-                                       , height: rad
-                                       , stroke: mainColor
-                                       , fill: mainColor
-                               });
-                               let rectPause2 = new fabric.Rect({
-                                       left: 2.1 * rad
-                                       , top: _o.height - 2.5 * rad
-                                       , visible: !_o.status.paused
-                                       , width: rad / 3
-                                       , height: rad
-                                       , stroke: mainColor
-                                       , fill: mainColor
-                               });
-                               let play = new fabric.Group([
-                                               new fabric.Circle({
-                                                       left: rad
-                                                       , top: _o.height - 3 * 
rad
-                                                       , radius: rad
-                                                       , stroke: mainColor
-                                                       , strokeWidth: 2
-                                                       , fill: null
-                                               })
-                                               , trg, rectPause1, rectPause2]
-                                       , {
-                                               objectCaching: false
-                                               , visible: false
-                                       });
-                               let cProgress = new fabric.Rect({
-                                       left: 3.5 * rad
-                                       , top: _o.height - 1.5 * rad
-                                       , visible: false
-                                       , width: _o.width - 5 * rad
-                                       , height: rad / 2
-                                       , stroke: mainColor
-                                       , fill: null
-                                       , rx: 5
-                                       , ry: 5
-                               });
-                               let isDone = function() {
-                                       return video.getElement().currentTime 
== video.getElement().duration;
-                               };
-                               let updateProgress = function() {
-                                       progress.set('width', 
(video.getElement().currentTime * cProgress.width) / 
video.getElement().duration);
-                                       canvas.renderAll();
-                               };
-                               let progress = new fabric.Rect({
-                                       left: 3.5 * rad
-                                       , top: _o.height - 1.5 * rad
-                                       , visible: false
-                                       , width: 0
-                                       , height: rad / 2
-                                       , stroke: mainColor
-                                       , fill: mainColor
-                                       , rx: 5
-                                       , ry: 5
-                               });
-                               let request;
-
-                               let opts = $.extend({
-                                       subTargetCheck: true
-                                       , objectCaching: false
-                                       , omType: 'Video'
-                                       , selectable: canvas.selection
-                               }, _filter(_o, ['fileId', 'fileType', 'slide', 
'uid', '_poster', '_src', 'width', 'height', 'status']));
-                               let group = new fabric.Group([video, poster, 
play, progress, cProgress], opts);
-
-                               let updateControls = function() {
-                                       video.visible = true;
-                                       poster.visible = false;
-
-                                       trg.visible = group.status.paused;
-                                       rectPause1.visible = 
!group.status.paused;
-                                       rectPause2.visible = 
!group.status.paused;
-                                       canvas.renderAll();
-                               };
-                               let render = function () {
-                                       if (isDone()) {
-                                               _sendStatus(group, true, 
video.getElement().duration);
-                                               updateControls();
-                                       }
-                                       updateProgress();
-                                       if (group.status.paused) {
-                                               cancelAnimationFrame(request);
-                                               canvas.renderAll();
-                                       } else {
-                                               request = 
fabric.util.requestAnimFrame(render);
-                                       }
-                               };
-                               cProgress.on({
-                                       'mousedown': function (evt) {
-                                               let _ptr = 
canvas.getPointer(evt.e)
-                                                       , ptr = 
canvas._normalizePointer(group, _ptr)
-                                                       , l = (group.width / 2 
+ ptr.x) * canvas.getZoom() - cProgress.aCoords.bl.x;
-                                               _sendStatus(group, 
group.status.paused, l * video.getElement().duration / cProgress.width)
-                                       }
-                               });
-                               play.on({
-                                       /*
-                                        * 
https://github.com/kangax/fabric.js/issues/4115
-                                        *
-                                       'mouseover': function() {
-                                               circle1.set({strokeWidth: 4});
-                                               canvas.renderAll();
-                                       }
-                                       , 'mouseout': function() {
-                                               circle1.set({
-                                                       left: pos.left
-                                                       , top: pos.top
-                                                       , strokeWidth: 2
-                                               });
-                                               canvas.renderAll();
-                                       }
-                                       , */'mousedown': function () {
-                                               play.set({
-                                                       left: pos.left + 3
-                                                       , top: pos.top + 3
-                                               });
-                                               canvas.renderAll();
-                                       }
-                                       , 'mouseup': function () {
-                                               play.set({
-                                                       left: pos.left
-                                                       , top: pos.top
-                                               });
-                                               if (!group.status.paused && 
isDone()) {
-                                                       
video.getElement().currentTime = 0;
-                                               }
-                                               _sendStatus(group, 
!group.status.paused, video.getElement().currentTime)
-                                               updateControls();
-                                       }
-                               });
-                               group.on({
-                                       'mouseover': function() {
-                                               play.visible = playable;
-                                               cProgress.visible = playable;
-                                               progress.visible = playable;
-                                               canvas.renderAll();
-                                       }
-                                       , 'mouseout': function() {
-                                               play.visible = false;
-                                               cProgress.visible = false;
-                                               progress.visible = false;
-                                               canvas.renderAll();
-                                       }
-                               });
-                               group.setPlayable = function(_r) {
-                                       playable = _r !== NONE;
-                               };
-                               group.videoStatus = function(_status) {
-                                       group.status = _status;
-                                       updateControls();
-                                       video.getElement().currentTime = 
group.status.pos;
-                                       updateProgress();
-                                       if (group.status.paused) {
-                                               video.getElement().pause();
-                                       } else {
-                                               video.getElement().play();
-                                               
fabric.util.requestAnimFrame(render);
-                                       }
-                               }
-                               group.setPlayable(_role);
-                               canvas.add(group);
-                               canvas.renderAll();
-                               player.modify(group, _o);
-
-                               let pos = {left: play.left, top: play.top};
-                       });
-               });
-       };
-       player.modify = function(g, _o) {
-               let opts = $.extend({
-                       angle: 0
-                       , left: 10
-                       , scaleX: 1
-                       , scaleY: 1
-                       , top: 10
-               }, _filter(_o, ['angle', 'left', 'scaleX', 'scaleY', 'top']));
-               g.set(opts);
-               g.canvas.renderAll();
-       };
-       return player;
-})();
-var Base = function() {
-       var base = {};
-       base.objectCreated = function(o, canvas) {
-               o.uid = UUID.generate();
-               o.slide = canvas.slide;
-               canvas.trigger("wb:object:created", o);
-               return o.uid;
-       }
-       return base;
-}
-var Pointer = function(wb, s) {
-       return {
-               activate: function() {
-                       wb.eachCanvas(function(canvas) {
-                               canvas.selection = true;
-                               canvas.forEachObject(function(o) {
-                                       o.selectable = true;
-                               });
-                       });
-                       s.find('[class^="wb-prop"]').prop('disabled', true);
-                       if (!!s.find('.wb-prop-b').button("instance")) {
-                               s.find('.wb-prop-b, .wb-prop-i, 
.wb-prop-lock-color, .wb-prop-lock-fill').button("disable");
-                       }
-               }
-               , deactivate: function() {
-                       wb.eachCanvas(function(canvas) {
-                               canvas.selection = false;
-                               canvas.forEachObject(function(o) {
-                                       o.selectable = false;
-                               });
-                       });
-               }
-       };
-}
-var APointer = function(wb) {
-       let pointer = Base();
-       pointer.user = '';
-       pointer.create = function(canvas, o) {
-               fabric.Image.fromURL('./css/images/pointer.png', function(img) {
-                       img.set({
-                               left:15
-                               , originX: 'right'
-                               , originY: 'top'
-                       });
-                       let circle1 = new fabric.Circle({
-                               radius: 20
-                               , stroke: '#ff6600'
-                               , strokeWidth: 2
-                               , fill: 'rgba(0,0,0,0)'
-                               , originX: 'center'
-                               , originY: 'center'
-                       });
-                       let circle2 = new fabric.Circle({
-                               radius: 6
-                               , stroke: '#ff6600'
-                               , strokeWidth: 2
-                               , fill: 'rgba(0,0,0,0)'
-                               , originX: 'center'
-                               , originY: 'center'
-                       });
-                       let text = new fabric.Text(o.user, {
-                               fontSize: 12
-                               , left: 10
-                               , originX: 'left'
-                               , originY: 'bottom'
-                       });
-                       let group = new fabric.Group([circle1, circle2, img, 
text], {
-                               left: o.x - 20
-                               , top: o.y - 20
-                       });
-
-                       canvas.add(group);
-                       group.uid = o.uid;
-                       group.loaded = !!o.loaded;
-
-                       let count = 3;
-                       function go(_cnt) {
-                               if (_cnt < 0) {
-                                       canvas.remove(group);
-                                       return;
-                               }
-                               circle1.set({radius: 3});
-                               circle2.set({radius: 6});
-                               circle1.animate(
-                                       'radius', '20'
-                                       , {
-                                               onChange: 
canvas.renderAll.bind(canvas)
-                                               , duration: 1000
-                                               , onComplete: function() 
{go(_cnt - 1);}
-                                       });
-                               circle2.animate(
-                                       'radius', '20'
-                                       , {
-                                               onChange: 
canvas.renderAll.bind(canvas)
-                                               , duration: 1000
-                                       });
-                       }
-                       go(count);
-               });
-       }
-       pointer.mouseUp = function(o) {
-               let canvas = this
-                       , ptr = canvas.getPointer(o.e);
-               if (pointer.user === '') {
-                       pointer.user = $('.room.sidebar.left .user.list 
.current .name').text();
-               }
-               let obj = {
-                       type: 'pointer'
-                       , x: ptr.x
-                       , y: ptr.y
-                       , user: pointer.user
-               };
-               obj.uid = uid = pointer.objectCreated(obj, canvas);
-               pointer.create(canvas, obj);
-       }
-       pointer.activate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.selection = false;
-                       canvas.on('mouse:up', pointer.mouseUp);
-               });
-       }
-       pointer.deactivate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.off('mouse:up', pointer.mouseUp);
-               });
-       };
-       return pointer;
-}
-var ShapeBase = function() {
-       var base = Base();
-       base.fill = {enabled: true, color: '#FFFF33'};
-       base.stroke = {enabled: true, color: '#FF6600', width: 5};
-       base.opacity = 1;
-       base.enableLineProps = function(s) {
-               var c = s.find('.wb-prop-color'), w = s.find('.wb-prop-width'), 
o = s.find('.wb-prop-opacity');
-               s.find('.wb-prop-fill').prop('disabled', true);
-               s.find('.wb-prop-b, .wb-prop-i, .wb-prop-lock-color, 
.wb-prop-lock-fill').button("disable");
-               c.val(base.stroke.color).prop('disabled', false);
-               w.val(base.stroke.width).prop('disabled', false);
-               o.val(100 * base.opacity).prop('disabled', false);
-               return {c: c, w: w, o: o};
-       };
-       base.enableAllProps = function(s) {
-               var c = s.find('.wb-prop-color'), w = s.find('.wb-prop-width')
-                       , o = s.find('.wb-prop-opacity'), f = 
s.find('.wb-prop-fill')
-                       , lc = s.find('.wb-prop-lock-color'), lf = 
s.find('.wb-prop-lock-fill');
-               s.find('.wb-prop-b, .wb-prop-i').button("disable");
-               lc.button("enable").button('option', 'icon', 
base.stroke.enabled ? 'ui-icon-unlocked' : 'ui-icon-locked');
-               lf.button("enable").button('option', 'icon', base.fill.enabled 
? 'ui-icon-unlocked' : 'ui-icon-locked');
-               c.val(base.stroke.color).prop('disabled', !base.stroke.enabled);
-               w.val(base.stroke.width).prop('disabled', false);
-               o.val(100 * base.opacity).prop('disabled', false);
-               f.val(base.fill.color).prop('disabled', !base.fill.enabled);
-       };
-       return base;
-}
-var Text = function(wb, s) {
-       var text = ShapeBase();
-       text.obj = null;
-       text.fill.color = '#000000';
-       text.stroke.width = 1;
-       text.stroke.color = '#000000';
-       text.style = {bold: false, italic: false};
-       //TODO font size, background color
-
-       text.mouseDown = function(o) {
-               var canvas = this;
-               var pointer = canvas.getPointer(o.e);
-               var ao = canvas.getActiveObject();
-               if (!!ao && ao.type == 'i-text') {
-                       text.obj = ao;
-               } else {
-                       text.obj = new fabric.IText('', {
-                               left: pointer.x
-                               , top: pointer.y
-                               , padding: 7
-                               , fill: text.fill.enabled ? text.fill.color : 
'rgba(0,0,0,0)'
-                               , stroke: text.stroke.enabled ? 
text.stroke.color : 'rgba(0,0,0,0)'
-                               , strokeWidth: text.stroke.width
-                               , opacity: text.opacity
-                       });
-                       if (text.style.bold) {
-                               text.obj.fontWeight = 'bold'
-                       }
-                       if (text.style.italic) {
-                               text.obj.fontStyle = 'italic'
-                       }
-                       canvas.add(text.obj).setActiveObject(text.obj);
-               }
-               text.obj.enterEditing();
-       };
-       text.activate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.on('mouse:down', text.mouseDown);
-                       canvas.selection = true;
-                       canvas.forEachObject(function(o) {
-                               if (o.type == 'i-text') {
-                                       o.selectable = true;
-                               }
-                       });
-               });
-               text.enableAllProps(s);
-               var b = s.find('.wb-prop-b').button("enable");
-               if (text.style.bold) {
-                       b.addClass('ui-state-active selected');
-               } else {
-                       b.removeClass('ui-state-active selected');
-               }
-               var i = s.find('.wb-prop-i').button("enable");
-               if (text.style.italic) {
-                       i.addClass('ui-state-active selected');
-               } else {
-                       i.removeClass('ui-state-active selected');
-               }
-       };
-       text.deactivate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.off('mouse:down', text.mouseDown);
-                       canvas.selection = false;
-                       canvas.forEachObject(function(o) {
-                               if (o.type == 'i-text') {
-                                       o.selectable = false;
-                               }
-                       });
-               });
-       };
-       return text;
-}
-var Paint = function(wb, s) {
-       var paint = ShapeBase(wb);
-       paint.activate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.isDrawingMode = true;
-                       canvas.freeDrawingBrush.width = paint.stroke.width;
-                       canvas.freeDrawingBrush.color = paint.stroke.color;
-                       canvas.freeDrawingBrush.opacity = paint.opacity; //TODO 
not working
-               });
-               paint.enableLineProps(s).o.prop('disabled', true); //TODO not 
working
-       };
-       paint.deactivate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.isDrawingMode = false;
-               });
-       };
-       return paint;
-}
-var Shape = function(wb) {
-       var shape = ShapeBase(wb);
-       shape.obj = null;
-       shape.isDown = false;
-       shape.orig = {x: 0, y: 0};
-
-       shape.add2Canvas = function(canvas) {
-               canvas.add(shape.obj);
-       }
-       shape.mouseDown = function(o) {
-               var canvas = this;
-               shape.isDown = true;
-               var pointer = canvas.getPointer(o.e);
-               shape.orig = {x: pointer.x, y: pointer.y};
-               shape.createShape(canvas);
-               shape.add2Canvas(canvas);
-       };
-       shape.mouseMove = function(o) {
-               var canvas = this;
-               if (!shape.isDown) return;
-               var pointer = canvas.getPointer(o.e);
-               shape.updateShape(pointer);
-               canvas.renderAll();
-       };
-       shape.updateCreated = function(o) {
-               return o;
-       };
-       shape.mouseUp = function(o) {
-               var canvas = this;
-               shape.isDown = false;
-               shape.obj.setCoords();
-               shape.obj.selectable = false;
-               canvas.renderAll();
-               shape.objectCreated(shape.obj, canvas);
-       };
-       shape.internalActivate = function() {};
-       shape.activate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.on({
-                               'mouse:down': shape.mouseDown
-                               , 'mouse:move': shape.mouseMove
-                               , 'mouse:up': shape.mouseUp
-                       });
-               });
-               shape.internalActivate();
-       };
-       shape.deactivate = function() {
-               wb.eachCanvas(function(canvas) {
-                       canvas.off({
-                               'mouse:down': shape.mouseDown
-                               , 'mouse:move': shape.mouseMove
-                               , 'mouse:up': shape.mouseUp
-                       });
-               });
-       };
-       return shape;
-};
-var Line = function(wb, s) {
-       var line = Shape(wb);
-       line.createShape = function(canvas) {
-               line.obj = new fabric.Line([line.orig.x, line.orig.y, 
line.orig.x, line.orig.y], {
-                       strokeWidth: line.stroke.width
-                       , fill: line.stroke.color
-                       , stroke: line.stroke.color
-                       , opacity: line.opacity
-               });
-               return line.obj;
-       };
-       line.internalActivate = function() {
-               line.enableLineProps(s);
-       };
-       line.updateShape = function(pointer) {
-               line.obj.set({ x2: pointer.x, y2: pointer.y });
-       };
-       return line;
-}
-var ULine = function(wb, s) {
-       var uline = Line(wb, s);
-       uline.stroke.width = 20;
-       uline.opacity = .5;
-       return uline;
-}
-var Rect = function(wb, s) {
-       var rect = Shape(wb);
-       rect.createShape = function(canvas) {
-               rect.obj = new fabric.Rect({
-                       strokeWidth: rect.stroke.width
-                       , fill: rect.fill.enabled ? rect.fill.color : 
'rgba(0,0,0,0)'
-                       , stroke: rect.stroke.enabled ? rect.stroke.color : 
'rgba(0,0,0,0)'
-                       , left: rect.orig.x
-                       , top: rect.orig.y
-                       , width: 0
-                       , height: 0
-               });
-               return rect.obj;
-       };
-       rect.internalActivate = function() {
-               rect.enableAllProps(s);
-       };
-       rect.updateShape = function(pointer) {
-               if (rect.orig.x > pointer.x) {
-                       rect.obj.set({ left: pointer.x });
-               }
-               if (rect.orig.y > pointer.y) {
-                       rect.obj.set({ top: pointer.y });
-               }
-               rect.obj.set({
-                       width: Math.abs(rect.orig.x - pointer.x)
-                       , height: Math.abs(rect.orig.y - pointer.y)
-               });
-       };
-       return rect;
-}
-var Ellipse = function(wb, s) {
-       var ellipse = Rect(wb, s);
-       ellipse.createShape = function(canvas) {
-               ellipse.obj = new fabric.Ellipse({
-                       strokeWidth: ellipse.stroke.width
-                       , fill: ellipse.fill.enabled ? ellipse.fill.color : 
'rgba(0,0,0,0)'
-                       , stroke: ellipse.stroke.enabled ? ellipse.stroke.color 
: 'rgba(0,0,0,0)'
-                       , left: ellipse.orig.x
-                       , top: ellipse.orig.y
-                       , rx: 0
-                       , ry: 0
-                       , originX: 'center'
-                       , originY: 'center'
-               });
-               return ellipse.obj;
-       };
-       ellipse.updateShape = function(pointer) {
-               ellipse.obj.set({
-                       rx: Math.abs(ellipse.orig.x - pointer.x)
-                       , ry: Math.abs(ellipse.orig.y - pointer.y)
-               });
-       };
-       return ellipse;
-}
-var Arrow = function(wb, s) {
-       var arrow = Line(wb, s);
-       arrow.createShape = function(canvas) {
-               arrow.obj = new fabric.Polygon([
-                       {x: 0, y: 0},
-                       {x: 0, y: 0},
-                       {x: 0, y: 0},
-                       {x: 0, y: 0},
-                       {x: 0, y: 0},
-                       {x: 0, y: 0},
-                       {x: 0, y: 0}]
-                       , {
-                               left: arrow.orig.x
-                               , top: arrow.orig.y
-                               , angle: 0
-                               , strokeWidth: 2
-                               , fill: arrow.fill.enabled ? arrow.fill.color : 
'rgba(0,0,0,0)'
-                               , stroke: arrow.stroke.enabled ? 
arrow.stroke.color : 'rgba(0,0,0,0)'
-                       });
-
-               return arrow.obj;
-       };
-       arrow.updateShape = function(pointer) {
-               var dx = pointer.x - arrow.orig.x
-               , dy = pointer.y - arrow.orig.y
-               , d = Math.sqrt(dx * dx + dy * dy)
-               , sw = arrow.stroke.width
-               , hl = sw * 3
-               , h = 1.5 * sw
-               , points = [
-                       {x: 0, y: sw},
-                       {x: Math.max(0, d - hl), y: sw},
-                       {x: Math.max(0, d - hl), y: h},
-                       {x: d, y: 3 * sw / 4},
-                       {x: Math.max(0, d - hl), y: 0},
-                       {x: Math.max(0, d - hl), y: sw / 2},
-                       {x: 0, y: sw / 2}];
-               arrow.obj.set({
-                       points: points
-                       , angle: Math.atan2(dy, dx) * 180 / Math.PI
-                       , width: d
-                       , height: h
-                       , maxX: d
-                       , maxY: h
-                       , pathOffset: {
-                               x: d / 2,
-                               y: h / 2
-                       }
-               });
-       };
-       arrow.internalActivate = function() {
-               arrow.enableAllProps(s);
-       };
-       return arrow;
-}
-var Clipart = function(wb, btn) {
-       var art = Shape(wb);
-       art.add2Canvas = function(canvas) {}
-       art.createShape = function(canvas) {
-               fabric.Image.fromURL(btn.data('image'), function(img) {
-                       art.orig.width = img.width;
-                       art.orig.height = img.height;
-                       art.obj = img.set({
-                               left: art.orig.x
-                               , top: art.orig.y
-                               , width: 0
-                               , height: 0
-                       });
-                       canvas.add(art.obj);
-               });
-       }
-       art.updateShape = function(pointer) {
-               if (!art.obj) {
-                       return; // not ready
-               }
-               var dx = pointer.x - art.orig.x, dy = pointer.y - art.orig.y;
-               var d = Math.sqrt(dx * dx + dy * dy);
-               art.obj.set({
-                       width: d
-                       , height: art.orig.height * d / art.orig.width
-                       , angle: Math.atan2(dy, dx) * 180 / Math.PI
-               });
-       }
-       return art;
-}
-var Wb = function() {
-       const ACTIVE = 'active';
-       const BUMPER = 100;
-       var wb = {id: -1, name: ''}, a, t, z, s, canvases = [], mode, slide = 
0, width = 0, height = 0
-                       , zoom = 1., zoomMode = 'fullFit', role = null, 
extraProps = ['uid', 'fileId', 'fileType', 'count', 'slide'];
-
-       function getBtn(m) {
-               return !!t ? t.find(".om-icon." + (m || mode)) : null;
-       }
-       function initToolBtn(m, def, obj) {
-               var btn = getBtn(m);
-               btn.data({
-                       obj: obj
-                       , activate: function() {
-                               if (!btn.hasClass(ACTIVE)) {
-                                       mode = m;
-                                       btn.addClass(ACTIVE);
-                                       obj.activate();
-                               }
-                       }
-                       , deactivate: function() {
-                               btn.removeClass(ACTIVE);
-                               obj.deactivate();
-                       }
-               }).click(function() {
-                       var b = getBtn();
-                       if (b.length && b.hasClass(ACTIVE)) {
-                               b.data().deactivate();
-                       }
-                       btn.data().activate();
-               });
-               if (def) {
-                       btn.data().activate();
-               }
-       }
-       function initCliparts() {
-               var c = $('#wb-area-cliparts').clone().attr('id', '');
-               getBtn('arrow').after(c);
-               c.find('a').prepend(c.find('div.om-icon.big:first'));
-               c.find('.om-icon.clipart').each(function(idx) {
-                       var cur = $(this);
-                       cur.css('background-image', 'url(' + cur.data('image') 
+ ')')
-                               .click(function() {
-                                       var old = c.find('a .om-icon.clipart');
-                                       c.find('ul li').prepend(old);
-                                       c.find('a').prepend(cur);
-                               });
-                       initToolBtn(cur.data('mode'), false, Clipart(wb, cur));
-               });
-       }
-       function confirmDlg(_id, okHandler) {
-               var confirm = $('#' + _id);
-               confirm.dialog({
-                       modal: true
-                       , buttons: [
-                               {
-                                       text: confirm.data('btn-ok')
-                                       , click: function() {
-                                               okHandler();
-                                               $(this).dialog("close");
-                                       }
-                               }
-                               , {
-                                       text: confirm.data('btn-cancel')
-                                       , click: function() {
-                                               $(this).dialog("close");
-                                       }
-                               }
-                       ]
-               });
-               return confirm;
-       }
-       function _updateZoomPanel() {
-               var ccount = canvases.length;
-               if (ccount > 1 && role === PRESENTER) {
-                       z.find('.doc-group').show();
-                       var ns = 1 * slide;
-                       z.find('.doc-group .curr-slide').val(ns + 
1).attr('max', ccount);
-                       z.find('.doc-group .up').prop('disabled', ns < 1);
-                       z.find('.doc-group .down').prop('disabled', ns > ccount 
- 2);
-                       z.find('.doc-group .last-page').text(ccount);
-               } else {
-                       z.find('.doc-group').hide();
-               }
-       }
-       function _setSlide(_sld) {
-               slide = _sld;
-               wbAction('setSlide', JSON.stringify({
-                       wbId: wb.id
-                       , slide: _sld
-               }));
-               _updateZoomPanel();
-       }
-       function internalInit() {
-               t.draggable({
-                       snap: "parent"
-                       , containment: "parent"
-                       , scroll: false
-                       , stop: function(event, ui) {
-                               var pos = ui.helper.position();
-                               if (pos.left == 0 || pos.left + 
ui.helper.width() == ui.helper.parent().width()) {
-                                       
ui.helper.removeClass('horisontal').addClass('vertical');
-                               } else if (pos.top == 0 || pos.top + 
ui.helper.height() == ui.helper.parent().height()) {
-                                       
ui.helper.removeClass('vertical').addClass('horisontal');
-                               }
-                       }
-               });
-               z.draggable({
-                       snap: "parent"
-                       , containment: "parent"
-                       , scroll: false
-               });
-               var _firstToolItem = true;
-               var clearAll = t.find('.om-icon.clear-all');
-               switch (role) {
-                       case PRESENTER:
-                               clearAll.click(function() {
-                                       confirmDlg('clear-all-confirm', 
function() { wbAction('clearAll', JSON.stringify({wbId: wb.id})); });
-                               }).removeClass('disabled');
-                               z.find('.curr-slide').change(function() {
-                                       _setSlide($(this).val() - 1);
-                                       showCurrentSlide();
-                               });
-                               z.find('.doc-group .up').click(function () {
-                                       _setSlide(1 * slide - 1);
-                                       showCurrentSlide();
-                               });
-                               z.find('.doc-group .down').click(function () {
-                                       _setSlide(1 * slide + 1);
-                                       showCurrentSlide();
-                               });
-                       case WHITEBOARD:
-                               if (role === WHITEBOARD) {
-                                       clearAll.addClass('disabled');
-                               }
-                               initToolBtn('pointer', _firstToolItem, 
Pointer(wb, s));
-                               _firstToolItem = false;
-                               initToolBtn('text', _firstToolItem, Text(wb, 
s));
-                               initToolBtn('paint', _firstToolItem, Paint(wb, 
s));
-                               initToolBtn('line', _firstToolItem, Line(wb, 
s));
-                               initToolBtn('uline', _firstToolItem, ULine(wb, 
s));
-                               initToolBtn('rect', _firstToolItem, Rect(wb, 
s));
-                               initToolBtn('ellipse', _firstToolItem, 
Ellipse(wb, s));
-                               initToolBtn('arrow', _firstToolItem, Arrow(wb, 
s));
-                               initCliparts();
-                               t.find(".om-icon.settings").click(function() {
-                                       s.show();
-                               });
-                               t.find('.om-icon.clear-slide').click(function() 
{
-                                       confirmDlg('clear-slide-confirm', 
function() { wbAction('clearSlide', JSON.stringify({wbId: wb.id, slide: 
slide})); });
-                               });
-                               t.find('.om-icon.save').click(function() {
-                                       wbAction('save', JSON.stringify({wbId: 
wb.id}));
-                               });
-                               t.find('.om-icon.undo').click(function() {
-                                       wbAction('undo', JSON.stringify({wbId: 
wb.id}));
-                               });
-                               s.find('.wb-prop-b, .wb-prop-i')
-                                       .button()
-                                       .click(function() {
-                                               
$(this).toggleClass('ui-state-active selected');
-                                               var btn = getBtn();
-                                               var isB = 
$(this).hasClass('wb-prop-b');
-                                               btn.data().obj.style[isB ? 
'bold' : 'italic'] = $(this).hasClass('selected');
-                                       });
-                               s.find('.wb-prop-lock-color, 
.wb-prop-lock-fill')
-                                       .button({icon: 'ui-icon-locked', 
showLabel: false})
-                                       .click(function() {
-                                               var btn = getBtn();
-                                               var isColor = 
$(this).hasClass('wb-prop-lock-color');
-                                               var c = s.find(isColor ? 
'.wb-prop-color' : '.wb-prop-fill');
-                                               var enabled = 
$(this).button('option', 'icon') == 'ui-icon-locked';
-                                               $(this).button('option', 
'icon', enabled ? 'ui-icon-unlocked' : 'ui-icon-locked');
-                                               c.prop('disabled', !enabled);
-                                               btn.data().obj[isColor ? 
'stroke' : 'fill'].enabled = enabled;
-                                       });
-                               s.find('.wb-prop-color').change(function() {
-                                       var btn = getBtn();
-                                       if (btn.length == 1) {
-                                               var v = $(this).val();
-                                               btn.data().obj.stroke.color = v;
-                                               if ('paint' == mode) {
-                                                       
wb.eachCanvas(function(canvas) {
-                                                               
canvas.freeDrawingBrush.color = v;
-                                                       });
-                                               }
-                                       }
-                               });
-                               s.find('.wb-prop-width').change(function() {
-                                       var btn = getBtn();
-                                       if (btn.length == 1) {
-                                               var v = 1 * $(this).val();
-                                               btn.data().obj.stroke.width = v;
-                                               if ('paint' == mode) {
-                                                       
wb.eachCanvas(function(canvas) {
-                                                               
canvas.freeDrawingBrush.width = v;
-                                                       });
-                                               }
-                                       }
-                               });
-                               s.find('.wb-prop-fill').change(function() {
-                                       var btn = getBtn();
-                                       if (btn.length == 1) {
-                                               var v = $(this).val();
-                                               btn.data().obj.fill.color = v;
-                                       }
-                               });
-                               s.find('.wb-prop-opacity').change(function() {
-                                       var btn = getBtn();
-                                       if (btn.length == 1) {
-                                               var v = (1 * $(this).val()) / 
100;
-                                               btn.data().obj.opacity = v;
-                                               if ('paint' == mode) {
-                                                       
wb.eachCanvas(function(canvas) {
-                                                               
canvas.freeDrawingBrush.opacity = v;
-                                                       });
-                                               }
-                                       }
-                               });
-                               
s.find('.ui-dialog-titlebar-close').click(function() {
-                                       s.hide();
-                               });
-                               s.draggable({
-                                       scroll: false
-                                       , containment: "body"
-                                       , start: function(event, ui) {
-                                               if (!!s.css("bottom")) {
-                                                       s.css("bottom", 
"").css("right", "");
-                                               }
-                                       }
-                                       , drag: function(event, ui) {
-                                               if (s.position().x + s.width() 
>= s.parent().width()) {
-                                                       return false;
-                                               }
-                                       }
-                               });
-                       case NONE:
-                               _updateZoomPanel();
-                               z.find('.zoom-out').click(function() {
-                                       zoom -= .2;
-                                       if (zoom < .1) {
-                                               zoom = .1;
-                                       }
-                                       zoomMode = 'zoom';
-                                       _setSize();
-                                       wbAction('setSize', JSON.stringify({
-                                               wbId: wb.id
-                                               , zoom: zoom
-                                               , zoomMode: zoomMode
-                                       }));
-                               });
-                               z.find('.zoom-in').click(function() {
-                                       zoom += .2;
-                                       zoomMode = 'zoom';
-                                       _setSize();
-                                       wbAction('setSize', JSON.stringify({
-                                               wbId: wb.id
-                                               , zoom: zoom
-                                               , zoomMode: zoomMode
-                                       }));
-                               });
-                               z.find('.zoom').change(function() {
-                                       var zzz = $(this).val();
-                                       zoomMode = 'zoom';
-                                       if (isNaN(zzz)) {
-                                               switch (zzz) {
-                                                       case 'fullFit':
-                                                       case 'pageWidth':
-                                                               zoomMode = zzz;
-                                                               break;
-                                                       case 'custom':
-                                                               zoom = 1. * 
$(this).data('custom-val');
-                                                               break;
-                                               }
-                                       } else {
-                                               zoom = 1. * zzz;
-                                       }
-                                       _setSize();
-                                       wbAction('setSize', JSON.stringify({
-                                               wbId: wb.id
-                                               , zoom: zoom
-                                               , zoomMode: zoomMode
-                                       }));
-                               });
-                               _setSize();
-                               initToolBtn('apointer', _firstToolItem, 
APointer(wb));
-               }
-       }
-       function _findObject(o) {
-               var _o = null;
-               canvases[o.slide].forEachObject(function(__o) {
-                       if (!!__o && o.uid === __o.uid) {
-                               _o = __o;
-                               return false;
-                       }
-               });
-               return _o;
-       }
-       function _removeHandler(o) {
-               var __o = _findObject(o);
-               if (!!__o) {
-                       var cnvs = canvases[o.slide];
-                       if (!!cnvs) {
-                               cnvs.discardActiveGroup();
-                               if ('Video' === __o.omType) {
-                                       $('#wb-video-' + __o.uid).remove();
-                               }
-                               cnvs.remove(__o);
-                       }
-               }
-       }
-       function _modifyHandler(_o) {
-               _removeHandler(_o);
-               _createHandler(_o);
-       }
-       function _createHandler(_o) {
-               switch (_o.fileType) {
-                       case 'Video':
-                       case 'Recording':
-                               //no-op
-                               break;
-                       case 'Presentation':
-                       {
-                               let ccount = canvases.length;
-                               let count = _o.deleted ? 1 : _o.count;
-                               for (let i = 0; i < count; ++i) {
-                                       if (canvases.length < i + 1) {
-                                               addCanvas();
-                                       }
-                                       let canvas = canvases[i];
-                                       canvas.setBackgroundImage(_o._src + 
"&slide=" + i, canvas.renderAll.bind(canvas), {});
-                               }
-                               _updateZoomPanel();
-                               if (ccount != canvases.length) {
-                                       let b = getBtn();
-                                       if (b.length && b.hasClass(ACTIVE)) {
-                                               b.data().deactivate();
-                                               b.data().activate();
-                                       }
-                               }
-                       }
-                               break;
-                       default:
-                       {
-                               let canvas = canvases[_o.slide];
-                               if (!!canvas) {
-                                       _o.selectable = canvas.selection;
-                                       canvas.add(_o);
-                               }
-                       }
-                               break;
-               }
-       }
-       function _createObject(arr, handler) {
-               fabric.util.enlivenObjects(arr, function(objects) {
-                       wb.eachCanvas(function(canvas) {
-                               canvas.renderOnAddRemove = false;
-                       });
-
-                       for (var i = 0; i < objects.length; ++i) {
-                               var _o = objects[i];
-                               _o.loaded = true;
-                               handler(_o);
-                       }
-
-                       wb.eachCanvas(function(canvas) {
-                               canvas.renderOnAddRemove = true;
-                               canvas.renderAll();
-                       });
-               });
-       };
-
-       function toOmJson(o) {
-               let r = o.toJSON(extraProps);
-               if (o.omType === 'Video') {
-                       r.type = 'video';
-                       delete r.objects;
-                       return r;
-               }
-               return r;
-       }
-       //events
-       function wbObjCreatedHandler(o) {
-               if (role === NONE && o.type != 'pointer') return;
-
-               var json = {};
-               switch(o.type) {
-                       case 'pointer':
-                               json = o;
-                               break;
-                       default:
-                               o.includeDefaultValues = false;
-                               json = toOmJson(o);
-                               break;
-               }
-               wbAction('createObj', JSON.stringify({
-                       wbId: wb.id
-                       , obj: json
-               }));
-       };
-       function objAddedHandler(e) {
-               var o = e.target;
-               if (!!o.loaded) return;
-               switch(o.type) {
-                       case 'i-text':
-                               o.uid = UUID.generate();
-                               o.slide = this.slide;
-                               wbObjCreatedHandler(o);
-                               break;
-                       default:
-                               o.selectable = this.selection;
-                               break;
-               }
-       };
-       function objModifiedHandler(e) {
-               var o = e.target;
-               if (role === NONE && o.type != 'pointer') return;
-
-               o.includeDefaultValues = false;
-               var items = [];
-               if ("group" === o.type && o.omType !== 'Video') {
-                       o.clone(function(_o) {
-                               // ungrouping
-                               _o.includeDefaultValues = false;
-                               var _items = _o.destroy().getObjects();
-                               for (var i = 0; i < _items.length; ++i) {
-                                       items.push(toOmJson(_items[i]));
-                               }
-                       }, extraProps);
-               } else {
-                       items.push(toOmJson(o));
-               }
-               wbAction('modifyObj', JSON.stringify({
-                       wbId: wb.id
-                       , obj: items
-               }));
-       };
-       function objSelectedHandler(e) {
-               var o = e.target;
-               s.find('.wb-dim-x').val(o.left);
-               s.find('.wb-dim-y').val(o.top);
-               s.find('.wb-dim-w').val(o.width);
-               s.find('.wb-dim-h').val(o.height);
-       }
-       function pathCreatedHandler(o) {
-               o.path.uid = UUID.generate();
-               o.path.slide = this.slide;
-               wbObjCreatedHandler(o.path);
-       };
-       function scrollHandler(e) {
-               $(this).find('.canvas-container').each(function(idx) {
-                       var h = $(this).height(), pos = $(this).position();
-                       if (slide != idx && pos.top > BUMPER - h && pos.top < 
BUMPER) {
-                               //TODO FIXME might be done without iterating
-                               //console.log("Found:", idx);
-                               _setSlide(idx);
-                               return false;
-                       }
-               });
-       }
-       function showCurrentSlide() {
-               a.find('.scroll-container 
.canvas-container').each(function(idx) {
-                       if (role === PRESENTER) {
-                               $(this).show();
-                               a.find('.scroll-container 
.canvas-container')[slide].scrollIntoView();
-                       } else {
-                               if (idx == slide) {
-                                       $(this).show();
-                               } else {
-                                       $(this).hide();
-                               }
-                       }
-               });
-       }
-       /*TODO interactive text change
-       var textEditedHandler = function (e) {
-               var obj = e.target;
-               console.log('Text Edit Exit', obj);
-       };
-       var textChangedHandler = function (e) {
-               var obj = e.target;
-               console.log('Text Changed', obj);
-       };*/
-       function setHandlers(canvas) {
-               // off everything first to prevent duplicates
-               canvas.off({
-                       'wb:object:created': wbObjCreatedHandler
-                       , 'object:modified': objModifiedHandler
-                       , 'object:added': objAddedHandler
-                       , 'object:selected': objSelectedHandler
-                       , 'path:created': pathCreatedHandler
-                       //, 'text:editing:exited': textEditedHandler
-                       //, 'text:changed': textChangedHandler
-               });
-               canvas.on({
-                       'wb:object:created': wbObjCreatedHandler
-                       , 'object:modified': objModifiedHandler
-               });
-               if (role !== NONE) {
-                       canvas.on({
-                               'object:added': objAddedHandler
-                               , 'object:selected': objSelectedHandler
-                               , 'path:created': pathCreatedHandler
-                               //, 'text:editing:exited': textEditedHandler
-                               //, 'text:changed': textChangedHandler
-                       });
-               }
-       }
-       function addCanvas() {
-               var sl = canvases.length;
-               var cid = 'can-' + a.attr('id') + '-slide-' + sl;
-               var c = $('<canvas></canvas>').attr('id', cid);
-               a.find('.canvases').append(c);
-               var canvas = new fabric.Canvas(c.attr('id'), {
-                       preserveObjectStacking: true
-               });
-               canvas.wbId = wb.id;
-               canvas.slide = sl;
-               canvases.push(canvas);
-               var cc = $('#' + cid).closest('.canvas-container');
-               if (role === NONE) {
-                       if (sl == slide) {
-                               cc.show();
-                       } else {
-                               cc.hide();
-                       }
-               }
-               __setSize(canvas);
-               setHandlers(canvas);
-       }
-       function __setSize(_cnv) {
-               _cnv.setWidth(zoom * width).setHeight(zoom * 
height).setZoom(zoom);
-       }
-       function _setSize() {
-               switch (zoomMode) {
-                       case 'fullFit':
-                               zoom = Math.min((a.width() - 10) / width, 
(a.height() - 10) / height);
-                               z.find('.zoom').val(zoomMode);
-                               break;
-                       case 'pageWidth':
-                               zoom = (a.width() - 10) / width;
-                               z.find('.zoom').val(zoomMode);
-                               break;
-                       default:
-                       {
-                               var oo = z.find('.zoom').find('option[value="' 
+ zoom.toFixed(2) + '"]');
-                               if (oo.length == 1) {
-                                       oo.prop('selected', true);
-                               } else {
-                                       z.find('.zoom').data('custom-val', 
zoom).find('option[value=custom]')
-                                               .text((100. * zoom).toFixed(0) 
+ '%')
-                                               .prop('selected', true);
-                               }
-                       }
-                               break;
-               }
-               wb.eachCanvas(function(canvas) {
-                       __setSize(canvas);
-               });
-       }
-       function _videoStatus(json) {
-               let g = _findObject(json);
-               if (!!g) {
-                       g.videoStatus(json.status);
-               }
-       }
-       wb.setRole = function(_role) {
-               if (role != _role) {
-                       var btn = getBtn();
-                       if (!!btn && btn.length == 1) {
-                               btn.data().deactivate();
-                       }
-                       a.find('.tools').remove();
-                       a.find('.wb-settings').remove();
-                       a.find('.wb-zoom').remove();
-                       role = _role;
-                       var sc = a.find('.scroll-container');
-                       z = $('#wb-zoom').clone().attr('id', '');
-                       if (role === NONE) {
-                               t = $('#wb-tools-readonly').clone().attr('id', 
'');
-                               sc.off('scroll', scrollHandler);
-                       } else {
-                               t = $('#wb-tools').clone().attr('id', '');
-                               s = $("#wb-settings").clone().attr('id', '');
-                               a.append(s);
-                               sc.on('scroll', scrollHandler);
-                       }
-                       a.append(t).append(z);
-                       showCurrentSlide();
-                       t = a.find('.tools'), s = a.find(".wb-settings");
-                       wb.eachCanvas(function(canvas) {
-                               setHandlers(canvas);
-                               canvas.forEachObject(function(__o) { //TODO 
reduce iterations
-                                       if (!!__o && __o.omType === 'Video') {
-                                               __o.setPlayable(role);
-                                       }
-                               });
-                       });
-                       internalInit();
-               }
-       };
-       wb.init = function(wbo, tid, _role) {
-               wb.id = wbo.wbId;
-               wb.name = wbo.name;
-               width = wbo.width;
-               height = wbo.height;
-               zoom = wbo.zoom;
-               zoomMode = wbo.zoomMode;
-               a = $('#' + tid);
-               addCanvas();
-               wb.setRole(_role);
-       };
-       wb.setSize = function(wbo) {
-               width = wbo.width;
-               height = wbo.height;
-               zoom = wbo.zoom;
-               zoomMode = wbo.zoomMode;
-               _setSize();
-       }
-       wb.resize = function(w, h) {
-               if (t.position().left + t.width() > a.width()) {
-                       t.position({
-                               my: "right"
-                               , at: "right-20"
-                               , of: '#' + a[0].id
-                               , collision: "fit"
-                       });
-               }
-               if (z.position().left + z.width() > a.width()) {
-                       z.position({
-                               my: "left top"
-                               , at: "center top"
-                               , of: '#' + a[0].id
-                               , collision: "fit"
-                       });
-               }
-               if (zoomMode !== 'zoom') {
-                       _setSize();
-               }
-       };
-       wb.setSlide = function(_sl) {
-               slide = _sl;
-               showCurrentSlide();
-       };
-       wb.createObj = function(obj) {
-               let arr = [], _arr = Array.isArray(obj) ? obj : [obj];
-               for (let i = 0; i < _arr.length; ++i) {
-                       let o = _arr[i];
-                       switch(o.type) {
-                               case 'pointer':
-                                       APointer().create(canvases[o.slide], o);
-                                       break;
-                               case 'video':
-                                       Player.create(canvases[o.slide], o, 
role);
-                                       break;
-                               default:
-                                       var __o = _findObject(o);
-                                       if (!__o) {
-                                               arr.push(o);
-                                       }
-                                       break;
-                       }
-               }
-               if (arr.length > 0) {
-                       _createObject(arr, _createHandler);
-               }
-       };
-       wb.load = wb.createObj;
-       wb.modifyObj = function(obj) { //TODO need to be unified
-               let arr = [], _arr = Array.isArray(obj) ? obj : [obj];
-               for (let i = 0; i < _arr.length; ++i) {
-                       let o = _arr[i];
-                       switch(o.type) {
-                               case 'pointer':
-                                       
_modifyHandler(APointer().create(canvases[o.slide], o))
-                                       break;
-                               case 'video':
-                               {
-                                       let g = _findObject(o);
-                                       if (!!g) {
-                                               Player.modify(g, o);
-                                       }
-                               }
-                                       break;
-                               default:
-                                       arr.push(o);
-                                       break;
-                       }
-               }
-               if (arr.length > 0) {
-                       _createObject(arr, _modifyHandler);
-               }
-       };
-       wb.removeObj = function(arr) {
-               for (var i = 0; i < arr.length; ++i) {
-                       _removeHandler(arr[i]);
-               }
-       };
-       wb.clearAll = function() {
-               for (var i = 1; i < canvases.length; ++i) {
-                       let cc = $('#can-wb-tab-0-slide-' + 
i).closest('.canvas-container');
-                       cc.remove();
-                       canvases[i].dispose();
-               }
-               $('.room.wb.area .wb-video').remove();
-               canvases.splice(1);
-               canvases[0].clear();
-               _updateZoomPanel();
-       };
-       wb.clearSlide = function(_sl) {
-               if (canvases.length > _sl) {
-                       let canvas = canvases[_sl];
-                       canvas.renderOnAddRemove = false;
-                       let arr = canvas.getObjects();
-                       while (arr.length > 0) {
-                               canvas.remove(arr[arr.length - 1]);
-                               arr = canvas.getObjects();
-                       }
-                       $('.room.wb.area .wb-video.slide-' + _sl).remove();
-                       canvas.renderOnAddRemove = true;
-                       canvas.renderAll();
-               }
-       };
-       wb.getCanvas = function() {
-               return canvases[slide];
-       };
-       wb.eachCanvas = function(func) {
-               for (var i = 0; i < canvases.length; ++i) {
-                       func(canvases[i]);
-               }
-       }
-       wb.videoStatus = _videoStatus;
-       return wb;
-};
-var WbArea = (function() {
-       var container, area, tabs, scroll, role = NONE, self = {}, _inited = 
false;
-
-       function refreshTabs() {
-               
tabs.tabs("refresh").find('ul').removeClass('ui-corner-all').removeClass('ui-widget-header');
-       }
-       function getActive() {
-               var idx = tabs.tabs("option", 'active');
-               if (idx > -1) {
-                       var href = tabs.find('a')[idx];
-                       if (!!href) {
-                               return $($(href).attr('href'));
-                       }
-               }
-               return null;
-       }
-       function deleteHandler(e) {
-               switch (e.which) {
-                       case 8:  // backspace
-                       case 46: // delete
-                               {
-                                       var wb = getActive().data();
-                                       var canvas = wb.getCanvas();
-                                       if (!!canvas) {
-                                               var arr = [];
-                                               if (!!canvas.getActiveGroup()) {
-                                                       
canvas.getActiveGroup().forEachObject(function(o) {
-                                                               arr.push({
-                                                                       uid: 
o.uid
-                                                                       , 
slide: o.slide
-                                                               });
-                                                       });
-                                               } else {
-                                                       var o = 
canvas.getActiveObject();
-                                                       if (!!o) {
-                                                               arr.push({
-                                                                       uid: 
o.uid
-                                                                       , 
slide: o.slide
-                                                               });
-                                                       }
-                                               }
-                                               wbAction('deleteObj', 
JSON.stringify({
-                                                       wbId: wb.id
-                                                       , obj: arr
-                                               }));
-                                               return false;
-                                       }
-                               }
-                               break;
-               }
-       }
-       function _activateTab(wbId) {
-               container.find('.wb-tabbar li').each(function(idx) {
-                       if (wbId == 1 * $(this).data('wb-id')) {
-                               tabs.tabs("option", "active", idx);
-                               $(this)[0].scrollIntoView();
-                               return false;
-                       }
-               });
-       }
-       function _resizeWbs() {
-               var w = area.width(), hh = area.height();
-               var wbTabs = area.find(".tabs.ui-tabs");
-               var tabPanels = wbTabs.find(".ui-tabs-panel");
-               var wbah = hh - 5 - wbTabs.find("ul.ui-tabs-nav").height();
-               tabPanels.height(wbah);
-               tabPanels.each(function(idx) {
-                       $(this).data().resize(w - 25, wbah - 20);
-               });
-               wbTabs.find(".ui-tabs-panel .scroll-container").height(wbah);
-       }
-       function _addCloseBtn(li) {
-               if (role != PRESENTER) {
-                       return;
-               }
-               li.append($('#wb-tab-close').clone().attr('id', ''));
-               li.find('button').click(function() {
-                       wbAction('removeWb', JSON.stringify({wbId: 
li.data().wbId}));
-               });
-       }
-       function _getImage(cnv, fmt) {
-               //TODO zoom ???
-               return cnv.toDataURL({
-                       format: fmt
-                       , width: cnv.width
-                       , height: cnv.height
-                       , multiplier: 1. / cnv.getZoom()
-                       , left: 0
-                       , top: 0
-               });
-       }
-       function _videoStatus(json) {
-               self.getWb(json.wbId).videoStatus(json);
-       }
-       function _initVideos(arr) {
-               for (let i = 0; i < arr.length; ++i) {
-                        _videoStatus(arr[i]);
-               }
-       }
-
-       self.getWbTabId = function(id) {
-               return "wb-tab-" + id;
-       };
-       self.getWb = function(id) {
-               return $('#' + self.getWbTabId(id)).data();
-       };
-       self.getCanvas = function(id) {
-               return self.getWb(id).getCanvas();
-       };
-       self.setRole = function(_role) {
-               if (!_inited) return;
-               role = _role;
-               var tabsNav = tabs.find(".ui-tabs-nav");
-               tabsNav.sortable(role === PRESENTER ? "enable" : "disable");
-               var prev = tabs.find('.prev.om-icon'), next = 
tabs.find('.next.om-icon');
-               if (role === PRESENTER) {
-                       if (prev.length == 0) {
-                               var cc = tabs.find('.wb-tabbar 
.scroll-container')
-                                       , left = 
$('#wb-tabbar-ctrls-left').clone().attr('id', '')
-                                       , right = 
$('#wb-tabbar-ctrls-right').clone().attr('id', '');
-                               cc.before(left).after(right);
-                               tabs.find('.add.om-icon').click(function() {
-                                       wbAction('createWb');
-                               });
-                               tabs.find('.prev.om-icon').click(function() {
-                                       scroll.scrollLeft(scroll.scrollLeft() - 
30);
-                               });
-                               tabs.find('.next.om-icon').click(function() {
-                                       scroll.scrollLeft(scroll.scrollLeft() + 
30);
-                               });
-                               tabsNav.find('li').each(function(idx) {
-                                       var li = $(this);
-                                       _addCloseBtn(li);
-                               });
-                               $(window).keyup(deleteHandler);
-                       }
-               } else {
-                       if (prev.length > 0) {
-                               prev.parent().remove();
-                               next.parent().remove();
-                               tabsNav.find('li button').remove();
-                       }
-                       $(window).off('keyup', deleteHandler);
-               }
-               tabs.find(".ui-tabs-panel").each(function(idx) {
-                       $(this).data().setRole(role);
-               });
-       }
-       self.init = function() {
-               container = $(".room.wb.area");
-               tabs = container.find('.tabs').tabs({
-                       beforeActivate: function(e, ui) {
-                               var res = true;
-                               if (e.originalEvent && e.originalEvent.type === 
'click') {
-                                       res = role === PRESENTER;
-                               }
-                               return res;
-                       }
-                       , activate: function(e, ui) {
-                               wbAction('activateWb', JSON.stringify({wbId: 
ui.newTab.data('wb-id')}));
-                       }
-               });
-               scroll = tabs.find('.scroll-container');
-               area = container.find(".wb-area");
-               tabs.find(".ui-tabs-nav").sortable({
-                       axis: "x"
-                       , stop: function() {
-                               refreshTabs();
-                       }
-               });
-               _inited = true;
-               self.setRole(role);
-       };
-       self.destroy = function() {
-               $(window).off('keyup', deleteHandler);
-       };
-       self.create = function(obj) {
-               if (!_inited) return;
-               var tid = self.getWbTabId(obj.wbId)
-                       , li = $('#wb-area-tab').clone().attr('id', 
'').data('wb-id', obj.wbId)
-                       , wb = $('#wb-area').clone().attr('id', tid);
-               li.find('a').text(obj.name).attr('title', 
obj.name).attr('href', "#" + tid);
-
-               tabs.find(".ui-tabs-nav").append(li);
-               tabs.append(wb);
-               refreshTabs();
-               _addCloseBtn(li);
-
-               var wbo = Wb();
-               wbo.init(obj, tid, role);
-               wb.data(wbo);
-               _resizeWbs();
-       }
-       self.createWb = function(obj) {
-               if (!_inited) return;
-               self.create(obj);
-               self.setRole(role);
-               _activateTab(obj.wbId);
-       };
-       self.activateWb = function(obj) {
-               if (!_inited) return;
-               _activateTab(obj.wbId);
-       }
-       self.load = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).load(json.obj);
-       };
-       self.setSlide = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).setSlide(json.slide);
-       };
-       self.createObj = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).createObj(json.obj);
-       };
-       self.modifyObj = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).modifyObj(json.obj);
-       };
-       self.deleteObj = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).removeObj(json.obj);
-       };
-       self.clearAll = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).clearAll();
-               Room.setSize();
-       };
-       self.clearSlide = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).clearSlide(json.slide);
-       };
-       self.removeWb = function(obj) {
-               if (!_inited) return;
-               var tabId = self.getWbTabId(obj.wbId);
-               tabs.find('li[aria-controls="' + tabId + '"]').remove();
-               $("#" + tabId).remove();
-               refreshTabs();
-       };
-       self.resize = function(posX, w, h) {
-               if (!container || !_inited) return;
-               var hh = h - 5;
-               container.width(w).height(h).css('left', posX + "px");
-               area.width(w).height(hh);
-
-               var wbTabs = area.find(".tabs.ui-tabs");
-               wbTabs.height(hh);
-               _resizeWbs();
-       }
-       self.setSize = function(json) {
-               if (!_inited) return;
-               self.getWb(json.wbId).setSize(json);
-       }
-       self.download = function(fmt) {
-               var wb = getActive().data();
-               if ('pdf' === fmt) {
-                       var arr = [];
-                       wb.eachCanvas(function(cnv) {
-                               arr.push(_getImage(cnv, 'image/png'));
-                       });
-                       wbAction('downloadPdf', JSON.stringify({
-                               slides: arr
-                       }));
-               } else {
-                       var cnv = wb.getCanvas()
-                               , a = document.createElement('a');
-                       a.setAttribute('target', '_blank')
-                       a.setAttribute('download', wb.name + '.' + fmt);
-                       a.setAttribute('href', _getImage(cnv, fmt));
-                       a.dispatchEvent(new MouseEvent('click', {view: window, 
bubbles: false, cancelable: true}));
-               }
-       }
-       self.videoStatus = _videoStatus;
-       self.loadVideos = function() { wbAction('loadVideos'); };
-       self.initVideos = _initVideos;
-       return self;
-})();
-$(function() {
-       Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
-               try {
-                       if (msg instanceof Blob) {
-                               return; //ping
-                       }
-                       var m = jQuery.parseJSON(msg);
-                       if (m) {
-                               switch(m.type) {
-                                       case "wb":
-                                               if (typeof WbArea !== 
'undefined') {
-                                                       eval(m.func);
-                                               }
-                                               break;
-                               }
-                       }
-               } catch (err) {
-                       console.log(err);
-                       //no-op
-               }
-       });
-});

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/965cba71/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 40cfa71..3bfe152 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,7 +60,7 @@
                <!--  URL of the ASF SonarQube server  -->
                
<sonar.host.url>https://builds.apache.org/analysis</sonar.host.url>
                <!--  Exclude all generated code  -->
-               <sonar.exclusions>file:**/generated-sources/**, 
file:**/fabric.js, file:**/cssemoticons.js</sonar.exclusions>
+               <sonar.exclusions>file:**/generated-sources/**, 
file:**/fabric.js, file:**/cssemoticons.js, file:**/uuid.js</sonar.exclusions>
                <db_user></db_user>
                <db_pass></db_pass>
        </properties>

Reply via email to