13$(document).ready(
function (){
15 addBlink=
function(myButton) {
16 if (typeof(myButton.addClass) ==
"undefined") {
17 $(
'#'+myButton.id).addClass(
'BlinkIcon');
19 myButton.addClass(
'BlinkIcon');
22 myButtonUnBlink=
function(myButton) {
23 if (typeof(myButton.removeClass) ==
"undefined") {
24 $(
'#'+myButton.id).removeClass(
'BlinkIcon');
25 var theId=myButton.id;
27 myButton.removeClass(
'BlinkIcon');
28 var theId=myButton.prop(
'id');
32 setTimeout(myButtonUnBlink,2000,myButton);
36 var notif_observer =
new MutationObserver(
function(e) {addBlink($(
".main-legend-zone"))});
37 notif_observer.observe($(
'#notifications').
get(0), {childList:
true, subtree:
true});
40 var stylesheets = document.styleSheets;
41 var sstyleRuleBorderBlink=
"";
42 var BorderBlinkColor=
false;
45 var RuleBorderBlinkId =
"";
46 for (var i = 0; i < stylesheets.length; ++i) {
47 if (stylesheets[i].href) {
48 if (stylesheets[i].href.includes(
"style.css")) {
49 sstyle = stylesheets[i];
52 for (var j = 0; j < sstyle.rules.length; ++j ) {
53 if (sstyle.rules[j].type == 7)
54 if (sstyle.rules[j].cssRules[0].style.cssText.includes(
"outline-color")) {
56 sstyleRuleBorderBlink=sstyle.rules[j].cssRules[0].style;
57 BorderBlinkColor=
true;
64 for (var j = 0; j < sstyle.cssRules.length; ++j ) {
65 if (sstyle.cssRules[j].cssText.includes(
"outline-color")) {
67 sstyleRuleBorderBlink=sstyle.cssRules[j];
68 BorderBlinkColor=
true;
81 addBorderBlink=
function(myElem,myColor) {
82 if (typeof(myElem.addClass) ==
"undefined") {
85 sstyleRuleBorderBlink.cssText=sstyleRuleBorderBlink.cssText.replace(/outline-color: .*;/,
"outline-color: "+myColor+
";");
86 $(
'#'+myElem.id).addClass(
'BlinkBorder');
88 }
else if (typeof(myElem[0]) ==
"object") {
91 sstyleRuleBorderBlink.cssText=sstyleRuleBorderBlink.cssText.replace(/outline-color: .*;/,
"outline-color: "+myColor+
";");
92 myElem.addClass(
'BlinkBorder');
95 myElemBorderUnBlink=
function(myElem) {
96 if (typeof(myElem.removeClass) ==
"undefined") {
97 $(
'#'+myElem.id).css(
"border",
"hidden");
98 $(
'#'+myElem.id).removeClass(
'BlinkBorder');
100 }
else if (typeof(myElem[0]) ==
"object") {
101 myElem.css(
"border",
"hidden");
102 myElem.removeClass(
'BlinkBorder');
103 var theId=myElem.prop(
'id');
106 setTimeout(myElemBorderUnBlink,2000,myElem);
109 function download(content, fileName, contentType) {
110 var a = document.createElement(
"a");
111 var file =
new Blob([content], {type: contentType});
112 a.href = URL.createObjectURL(file);
113 a.download = fileName;
115 URL.revokeObjectURL(a.href)
119 _allowDragAndDrop =
true;
120 BlockDragAndDrop=
function() {
121 _allowDragAndDrop =
false;
122 $(
'.handle').addClass(
"drag-handle-off").removeClass(
"drag-handle-on");
125 EnableDragAndDrop=
function() {
126 _allowDragAndDrop =
true;
127 $(
'.handle').addClass(
"drag-handle-on").removeClass(
"drag-handle-off");
130 function parseBool(val) {
return val ===
true || val ===
"true" };
132Mesh =
function(cardinal,NumColumnsConstant,maxNumOfColumns_) {
134 $(
'#legend').html(
"<h1>Working on "+my_session+
"</h1> <h2>Number of nodes : "+cardinal.toString()+
"</h2>");
137 var debugPos =
false;
140 var nodeCardinal = cardinal;
145 var nodesOldPositions = [];
154 var numOfColumns = [];
155 var maxNumOfColumns = maxNumOfColumns_;
156 var locationJsonDataConsistency = false ;
157 var widthTab =
new Array();
158 var heightTab =
new Array();
159 var columnSelected = -1 ;
160 var lineSelected = -1 ;
162 var touchspeed = configBehaviour.touchSpeed;
166 if (parseBool(configBehaviour.smoothRotation)) {
167 RotInc=parseFloat(configBehaviour.RotationSpeed);
174 var zoomSelection =
false;
175 var removingTag =
false;
176 var tagToRemove =
"";
177 var selectingTags =
false;
178 var tagToSelect =
"";
179 var alignTags =
false;
180 var alignOrderTag=
true;
182 var hideNodesTag =
false;
183 var killNodesTag =
false;
184 var transparentNode = -1;
186 var HideNodesTagFlag=
false;
188 var KillNodesTagFlag=
false;
189 var SelectionMultipleTagsFlag =
false;
191 var SelectionNodeToTagFlag=
false;
192 var PaletteNodeTagFlag=
false;
197 if (!! configBehaviour.onlyMasterMS)
198 configBehaviour.onlyMasterMS=
false
199 configBehaviour.touchonWindow=
false
202 this.getZoomSelection =
function(){
203 return zoomSelection;
206 this.setZoomSelection =
function (bool){
207 zoomSelection = bool;
211 this.getRemovingTag =
function(){
215 this.setRemovingTag =
function(bool){
219 this.getTagToRemove =
function(){
223 this.setTagToRemove =
function(text){
228 this.getSelectTags =
function() {
229 return selectingTags;
231 this.setSelectTags =
function(bool){
232 selectingTags = bool;
235 this.getSelectionTag =
function() {
236 return SelectionNodeToTagFlag;
238 this.setSelectionTag =
function(bool){
239 SelectionNodeToTagFlag = bool;
242 this.getSelectMultipleTags =
function() {
243 return SelectionMultipleTagsFlag;
245 this.setSelectMultipleTags =
function(bool){
246 SelectionMultipleTagsFlag = bool;
247 if (! SelectionMultipleTagsFlag) {
248 $(
'.closeSelectMultipleTagsButtonIcon').removeClass(
'closeSelectMultipleTagsButtonIcon').addClass(
'selectMultipleTagsButtonIcon');
253 this.getTagToSelect =
function(){
257 this.setTagToSelect =
function(text){
263 this.getAlignTags =
function() {
266 this.setAlignTags =
function(bool){
271 this.getHideNodesTag =
function() {
274 this.setHideNodesTag =
function(bool){
278 this.getHideNodesTagFlag =
function() {
279 return HideNodesTagFlag;
281 this.setHideNodesTagFlag =
function(bool){
282 HideNodesTagFlag = bool;
286 this.getkillNodesTag =
function() {
289 this.setkillNodesTag =
function(bool){
293 this.getKillNodesTagFlag =
function() {
294 return KillNodesTagFlag;
296 this.setKillNodesTagFlag =
function(bool){
297 KillNodesTagFlag = bool;
301 $(
'header').append(
"<div id=OpacityZone ></div>")
304 this.getTransparent =
function(){
305 return transparentNode;
307 this.setTransparent =
function(id, state){
309 transparentNode = state ? id : -1;
311 this.getNode(
id).updateHtmlNodeState(state ? 4 : 0);
312 var nodeOpacity = this.getNode(
id).getNodeOpacity();
313 $(
'#'+
id).css(
"opacity", state ? nodeOpacity : 1);
314 $(
'#'+
id).css(
"z-index", state ? 100 : 0 );
315 $(
'#tile-opacity-'+
id).css(
"visibility", state ?
"visible" :
"hidden");
318 $(
'#'+
id).addClass(
"transparentNode");
319 for( mi in $(
'#menu'+
id)[0].childNodes ){
320 m=$(
'#menu'+
id)[0].childNodes[mi];
321 if (m.id && m.id.search(
"option") > -1) {
322 if ( m.className.search(
"transparentButtonIcon") > -1) {
324 $(
'#menu'+
id+
'>#'+m.id).css({visibility :
"hidden"});
328 $(
'#tile-opacity-'+
id).append(
"<input id=tileOpacitySlider"+
id+
" class=tile-opacity-slider type='range' name=tileOpacitySlider"+
id+
" min=0 max=100 value="+nodeOpacity*100+
">");
329 $(
'#tileOpacitySlider'+
id).off(
"click").off(
"mousup");
330 $(
'#tileOpacitySlider'+
id).on({
332 var nodeOpacity_ = Math.max($(
'#tileOpacitySlider'+
id).val()/100, 0.1);
333 $(
'#'+
id).css(
"opacity", nodeOpacity_);
335 mouseup :
function(e) {
336 var nodeOpacity_ = $(
'#tileOpacitySlider'+
id).val()/100;
337 cdata={
"room":my_session,
"Id":id,
"Opacity":nodeOpacity_};
338 socket.emit(
"change_Opacity", cdata, callback=
function(sdata){
339 console.log(
"socket change Opacity Tag ", cdata);
343 var val = ($(
'#tileOpacitySlider'+
id).val() - $(
'#tileOpacitySlider'+
id).attr(
'min')) / ($(
'#tileOpacitySlider'+
id).attr(
'max') - $(
'#tileOpacitySlider'+
id).attr(
'min'));
345 $(
'#tileOpacitySlider'+
id).css(
'background-image',
346 '-webkit-gradient(linear, left top, right top, '
347 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
348 +
'color-stop(' + val +
', rgb(0, 255, 0))'
353 $(
'#tileOpacitySlider'+
id).change(
function () {
354 var val = ($(
this).val() - $(
this).attr(
'min')) / ($(
this).attr(
'max') - $(
this).attr(
'min'));
356 $(
this).css(
'background-image',
357 '-webkit-gradient(linear, left top, right top, '
358 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
359 +
'color-stop(' + val +
', rgb(0, 255, 0))'
365 $(
'#'+
id).removeClass(
"transparentNode");
366 me.meshEventReStart();
368 for( mi in $(
'#menu'+
id)[0].childNodes ){
369 m=$(
'#menu'+
id)[0].childNodes[mi];
370 if (m.id && m.id.search(
"option") > -1) {
371 if (m.className.search(
"transparentButtonIcon") > -1) {
373 $(
'#menu'+
id+
'>#'+m.id).css({visibility :
""});
377 $(
'#tile-opacity-'+
id).css(
"visibility",
"hidden");
378 me.getNode(
id).setNodeOpacity(Math.max($(
'#tileOpacitySlider'+
id).val()/100, 0.1));
380 $(
'#tileOpacitySlider'+
id).remove();
393 var Ntab =
new Array();
394 for(j=0;j<jsDataTab.length;j++) {
397 for(j=0;j<jsDataTab.length;j++) {
398 if(typeof parseInt(jsDataTab[j].IdLocation) ==
"number" && Ntab.indexOf(parseInt(jsDataTab[j].IdLocation)) > -1) {
399 Ntab.splice(Ntab.indexOf(parseInt(jsDataTab[j].IdLocation)),1);
403 if(t==jsDataTab.length){
404 locationJsonDataConsistency =
true;
405 useJsonDataLocation=
true;
408 locationJsonDataConsistency =
false;
409 useJsonDataLocation=
false;
420 var ColumnStyle =
"dynamic";
423 if( !(typeof maxNumOfColumns ==
'number' && maxNumOfColumns> 2)) {
424 maxNumOfColumns = 10;
427 if( NumColumnsConstant ==
true ) {
428 ColumnStyle =
"static";
435 var spread = configBehaviour.spread;
437 spread.X = spread.X*1.02;
439 var borderSize = configBehaviour.borderSize;
441 var selectedNodes=
new Array();
443 var nodesToToggle =
new Array();
445 var nodesToZoom =
new Array();
447 var appliedFilters =
new Array();
449 var listedTags =
new Array();
454 this.addNodeToZoom =
function(node){
455 if (nodesToZoom.indexOf(node)==-1) {
456 nodesToZoom.push(node);
461 this.removeNodeToZoom =
function(node){
462 nodesToZoom.splice(nodesToZoom.indexOf(node),1);
466 this.getNodesToZoom =
function(){
471 this.resetNodesToZoom =
function(){
472 nodesToZoom =
new Array();
473 for (O in nodesByLoc)
474 if (nodesByLoc[O].getNodeInViewportStatus())
475 nodesByLoc[O].sub(
'hitbox').css({backgroundColor : colorHBdefault});
492 this.magnifyingGlass =
function(nodeZoomTab,ratio,initSpread,Haswaypoint, initScale){
494 var initScale_ = initScale ||
false;
496 var supportW = parseInt(window.innerWidth*initScale_)-90;
497 var supportH = parseInt(ratio*(parseInt(window.innerWidth*initScale_)-500));
498 var Zscale=initScale_;
500 var supportW = parseInt(window.innerWidth)-90;
501 var supportH = parseInt(ratio*(parseInt(window.innerWidth)-500));
506 var Haswaypoint_ = Haswaypoint || false ;
510 var waypoint =
new Array();
513 if(nodeZoomTab.length!=0){
515 $(
"body").append(
'<div id=superSail></div>');
516 $(
"#superSail").css({
517 position :
'absolute',
522 backgroundColor :
"black",
526 $(
"#superSail").off(
'touchstart');
527 $(
"#superSail").off(
'touchmove');
528 $(
"#superSail").off(
'touchend');
529 $(
'#superSail').append(
'<div id=buttonUnzoom class=unzoomButtonIcon></div>');
530 $(
'#buttonUnzoom').css({
533 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
537 backgroundColor:
"rgba(0, 0, 0, 0.95)"
542 for (O in nodesByLoc)
543 if (nodesByLoc[O].getNodeInViewportStatus())
544 nodesByLoc[O].sub(
'iframe').hide();
554 var supp = document.getElementById(
"zoomSupport");
556 $(
"body").append(
'<div id=zoomSupport style="overflow-y: scroll;"></div>');
557 $(
"#zoomSupport").css({
560 top:Math.max(450,TagHeight+240),
565 backgroundColor :
"grey",
571 $(
"#zoomSupport").off(
'touchstart');
572 $(
"#zoomSupport").off(
'touchmove');
573 $(
"#zoomSupport").off(
'touchend');
575 $(
'#zoomSupport').show();
580 var L = Math.min(nodeZoomTab.length,2);
581 if ( nodeZoomTab.length > 12 ) {
582 L = Math.min(nodeZoomTab.length,3);
592 var NbZ=nodeZoomTab.length
595 var NbL=Math.max(NbZ/L,1);
606 var Zscale=H/initSpread.Y;
608 shifttop=
function(e) {
return (H+60)*parseInt(e/L)+shiftY };
609 shiftleft=
function(e) {
return W*parseInt(e % L)+shiftX };
612 nodeZoomState=
new Array();
613 nodeZoomState.length=NbZ;
614 nodeZoomState.fill(
true)
617 ZclickSticker =
function(){
619 var splittedId = this.
id.split(
"_");
620 var nodeId = splittedId.pop();
621 var node = me.getNode(nodeId);
622 var zoomed = $(
'#Zoomed'+nodeId);
623 zoomed.children(
".stickers_zone").find(
'#'+this.
id).remove();
624 var nodelev=$(
'#'+nodeId).css(
"z-index");
625 $(
'#'+nodeId).css(
"z-index",999);
626 thisSticker=$(
'#'+nodeId).children(
".stickers_zone").find(
'#'+this.
id);
628 $(
'#'+nodeId).show();
630 $(
'#'+nodeId).css(
"z-index",nodelev);
634 for(var e=0;e<NbZ;e++){
636 thisnode=nodeZoomTab[e];
640 thisnodeId=$(
"#"+thisnode.getId());
641 var iframe2 = $(
'#iframe'+
id);
643 $(
"body").append(
'<div id=Zoomed'+e+
' class=Zoomed></div>');
644 thiszoom=$(
"#Zoomed"+e);
645 thiszoom.appendTo(
"#zoomSupport");
648 position :
'absolute',
650 left : shiftleft(e)+shiftcol,
653 backgroundColor :
"black",
663 iframesrc=thisnode.getJsonData().url;
668 thiszoom.append(
'<iframe id=Ziframe'+e+
' height="'+initSpread.Y+
'px" width="'+initSpread.X+
'px" position="relative"'+
' scrolling="yes"'+
' frameborder=0'+
' src=""></iframe>');
670 if ( Haswaypoint_ ) {
672 waypoint[e] =
new Waypoint({
674 offset :
'bottom-in-view' ,
675 element: document.getElementById(
"Zoomed"+e),
677 handler: (
function(){
680 var iframesrc_=iframesrc;
681 return function(direction) {
682 if (direction ==
"down") {
683 iframe2=$(
'#Ziframe'+
id);
684 if (iframe2.attr(
"src")==
"")
685 iframe2.attr(
"src",iframesrc_);
686 waypoint[id].destroy();
688 iframe2=$(
'#Ziframe'+
id);
689 if (iframe2.attr(
"src")==
"")
690 iframe2.attr(
"src",iframesrc_);
691 waypoint[id].destroy();
699 $(
'#Ziframe'+e).attr(
"src",iframesrc);
702 var Zinfo=thisnodeId.children(
".info").clone().css(
'display',
'block').appendTo(
"#Zoomed"+e);
703 Zinfo[0].id=
"Z"+Zinfo[0].id;
705 Zframe=$(
'#Ziframe'+e);
706 Zframe.css(
'-webkit-transform',
'scale('+Zscale+
')').css(
'-moz-transform',
'scale('+Zscale+
')');
711 Zinfo.css(
'-webkit-transform',
'scale('+Zscale/2+
')').css(
'-moz-transform',
'scale('+Zscale/2+
')');
712 Zinfo.css(
'top',
"-60px").css(
"left",zoomX*1./2).css(
"position",
"absolute");;
716 var Zsticker=thisnodeId.children(
".stickers_zone").clone().css(
'display',
'block').appendTo(
"#Zoomed"+e);
717 Zsticker[0].id=
"Z"+Zsticker[0].id;
720 thiszoom.prepend(
'<div id="Zclose'+e+
'" class=unzoomButtonIcon></div>');
721 Zclose=$(
'#Zclose'+e);
723 position:
'absolute',
726 left: spread.X*Zscale,
729 '-webkit-transform':
'scale('+Zscale/4+
')',
730 '-moz-transform':
'scale('+Zscale/4+
')'
732 Zclose.on(
"click",
function() {
733 var e = parseInt(this.
id.replace(
"Zclose",
""));
734 $(
"#Zoomed"+e).remove();
735 nodeZoomState[e]=
false;
737 for(var ee=0;ee<NbZ;ee++){
738 if ( ee != e && nodeZoomState[ee] ) {
739 thiszoom=$(
"#Zoomed"+ee);
742 top : shifttop(iter),
743 left : shiftleft(iter)
750 Zsticker.css(
'-webkit-transform',
'scale('+Zscale/2+
')').css(
'-moz-transform',
'scale('+Zscale/2+
')');
752 left: spread.X*Zscale+80,
753 top: (parseInt(Zclose.css(
"top"))+
754 parseInt(Zclose.css(
"height")))*Zscale,
755 position:
"absolute",
759 Zsticker.children(
'.sticker').on({
760 click : ZclickSticker
766 var zoomValue = $(
'#zoomSupport').children(
".Zoomed").children(
"iframe").css(
"transform");
767 zoomValue = zoomValue.replace(
"matrix(",
"").replace(
")",
"").split(
",")[0];
769 $(
'#superSail').append(
"<div id=zoom-slider-label>Zoom level</div>")
770 .append(
"<input id=zoomSlider name=zoomSlider class=slider type=range min="+zoomValue/2+
" max="+2*zoomValue+
" step=0.01 value="+zoomValue+
" oninput='zoom.value=zoomSlider.value.toString()'>")
771 .append(
"<output name=zoom id=zoom class=slider for=zoomSlider>"+zoomValue+
"</output>");
773 $(
'#zoomSlider').change(
function () {
774 var val = ($(
this).val() - $(
this).attr(
'min')) / ($(
this).attr(
'max') - $(
this).attr(
'min'));
776 $(
this).css(
'background-image',
777 '-webkit-gradient(linear, left top, right top, '
778 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
779 +
'color-stop(' + val +
', rgb(0, 255, 0))'
783 $(
'#zoom-slider-label').css({
789 backgroundColor:
"rgba(0, 0, 0, 1)"
791 $(
'#zoomSlider').css({
793 top : parseInt($(
'#buttonUnzoom').css(
"height")),
795 width : 30/100 * parseInt($(
'header').css(
"width")),
796 backgroundColor:
"rgba(0, 0, 0, 1)"
798 var val = (zoomValue - $(
'#zoomSlider').attr(
'min')) / ($(
'#zoomSlider').attr(
'max') - $(
'#zoomSlider').attr(
'min'));
800 $(
'#zoomSlider').css(
'background-image',
801 '-webkit-gradient(linear, left top, right top, '
802 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
803 +
'color-stop(' + val +
', rgb(0, 255, 0))'
809 left : parseInt($(
'#zoomSlider').css(
"width")) + parseInt($(
'#zoomSlider').css(
"left")),
814 backgroundColor:
"black"
818 $(
'#zoomSlider').on({
820 if ( configBehaviour.sharedSliderZoom && emit_click_val(
'slider',
'zoomSlider', $(
'#zoomSlider').val()) )
822 if ( configBehaviour.sharedSliderZoom && emit_click_val(
'slider',
'zoom', $(
'#zoomSlider').val()) )
825 var newZoom = $(
'#zoomSlider').val();
826 $(
'#zoom').val(newZoom);
827 var ratio = newZoom/zoomValue;
828 $(
'#zoomSupport').css(
"-moz-transform",
"scale("+ratio+
")").css(
"-webkit-transform",
"scale("+ratio+
")").css(
"transform-origin",
"0 0 0");
836 $(
'#buttonUnzoom').on(
'click',
function(){
838 $(
"#superSail").remove();
839 $(
"#zoomSupport").hide();
840 $(
'#zoomSupport').css(
"-moz-transform",
"scale(1)").css(
"-webkit-transform",
"scale(1)").css(
"transform-origin",
"0 0 0");
841 $(
'#zoomSupport').children(
".Zoomed").remove();
842 $(
"#buttonUnzoom").off();
843 $(
"#buttonUnzoom").remove();
846 for (O in nodesByLoc)
847 if (nodesByLoc[O].getNodeInViewportStatus()) {
848 nodesByLoc[O].sub(
'hitbox').off().on(
"click", clickHBSelect);
849 nodesByLoc[O].sub(
'iframe').show();
860 var moveMesh =
function(direction) {
861 numOfLines = Math.floor(nodeCardinal / numOfColumns);
862 numOfLines = Math.min(numOfLines, nodeCardinal);
864 me.computeNumColumns();
865 for (var i=0;i<(numOfLines-1);i++) {
867 if (direction ==
"up") {
870 var secondLine = i+1 == numOfLines ? 0 : i+1;
872 else if (direction ==
"down") {
874 var firstLine = numOfLines - 1 - i;
875 var secondLine = numOfLines - 2 - i;
878 var firstLineTab =
new Array();
879 var secondLineTab =
new Array();
881 for (O in nodesByLoc) {
882 if (me.mlocationProvider(nodesByLoc[O].getIdLocation()).getnY() == firstLine ) {
883 firstLineTab.push(nodesByLoc[O]);
885 else if (me.mlocationProvider(nodesByLoc[O].getIdLocation()).getnY() == secondLine ) {
886 secondLineTab.push(nodesByLoc[O]);
889 for (var j=0; j<Math.max(firstLineTab.length, secondLineTab.length);j++) {
890 var tmpBoolBlockMove = j == 0 ? false :
true;
891 if(typeof firstLineTab[j]!=
"undefined" && typeof secondLineTab[j]!=
"undefined" ) {
892 me.switchLocation(firstLineTab[j],secondLineTab[j],configBehaviour.showAnimationsLineColSwap,
true, tmpBoolBlockMove);
896 for (O in nodesByLoc) {
897 if (nodesByLoc[O].getNodeInViewportStatus()) {
899 SetOn(nodesByLoc[O].getId());
901 SetOff(nodesByLoc[O].getId());
910 refreshNodes =
function (node) {
914 if (typeof(node) ==
"undefined")
920 for (O in nodesByLoc) {
921 nodesByLoc[O].setNodeInViewportStatus()
922 if (nodesByLoc[O].getNodeInViewportStatus()) {
924 SetOn(nodesByLoc[O].getId());
926 SetOff(nodesByLoc[O].getId());
932 for (O in nodesById) {
933 me.unsetDraggable(nodesById[O].getId(),
false,
false);
950 nodesByLoc[node].setNodeInViewportStatus()
951 me.unsetDraggable(node);
953 me.meshEventReStart();
958 receive_deploy_Selection=
false
959 socket.on(
'receive_deploy_Selection',
function(sdata){
960 console.log(
"receive_deploy_Selection",sdata);
961 var listSelectionIds = eval(sdata[
"Selection"]);
962 for (O in listSelectionIds) {
963 var HB = $(
'#hitbox' + listSelectionIds[O]);
964 var node = nodesById[
"node"+listSelectionIds[O]];
965 node.updateSelectedStatus(
true);
966 me.addNodeToZoom(node);
967 HB.css({backgroundColor : colorHBtoZoom});
969 receive_deploy_Selection=
true
973 socket.on(
'receive_deploy_nodes',
function(sdata){
974 console.log(
"receive_deploy_nodes",sdata);
975 var jsDataTab_mod = sdata[
"modtiles_data"];
978 for ( idadd in jsDataTab_mod ) {
979 var tile1=jsDataTab_mod[idadd][0]
980 var tile2=jsDataTab_mod[idadd][1]
981 for (O in nodesById) {
982 var node=nodesById[O];
984 if (node.getJsonData()[
"url"] == tile2[
"url"]) {
986 var newTags=node.updatedata(tile2);
989 for (var itag in newTags) {
990 me.AddNewTag(newTags[itag]);
999 me.meshEventReStart();
1003 suggestion_list = globalTagsList
1004 .concat($(
'.info').map(
function(){
return $.trim($(
this).text());}).get())
1005 .concat(Object.keys(nodesById).map(
function(e){return $.trim(nodesById[e].getJsonData().comment); }));
1047 var tagMenuTitleTab =
new Array();
1048 var tagMenuEventTab =
new Array();
1049 var tagMenuIconClassAttributesTab =
new Array();
1050 var tagMenuShareEvent =
new Array();
1052 var tagAlignOrderTagsMenuTitleTab =
new Array();
1053 var tagAlignOrderTagsMenuEventTab =
new Array();
1054 var tagAlignOrderTagsMenuIconClassAttributesTab =
new Array();
1055 var tagAlignOrderTagsMenuShareEvent =
new Array();
1057 var tagHideTagsMenuTitleTab =
new Array();
1058 var tagHideTagsMenuEventTab =
new Array();
1059 var tagHideTagsMenuIconClassAttributesTab =
new Array();
1060 var tagHideTagsMenuShareEvent =
new Array();
1062 var tagKillTagsMenuTitleTab =
new Array();
1063 var tagKillTagsMenuEventTab =
new Array();
1064 var tagKillTagsMenuIconClassAttributesTab =
new Array();
1065 var tagKillTagsMenuShareEvent =
new Array();
1067 var tagSelectionMenuTitleTab =
new Array();
1068 var tagSelectionMenuEventTab =
new Array();
1069 var tagSelectionMenuIconClassAttributesTab =
new Array();
1070 var tagSelectionMenuShareEvent =
new Array();
1072 var tagManagementMenuTitleTab =
new Array();
1073 var tagManagementMenuEventTab =
new Array();
1074 var tagManagementMenuIconClassAttributesTab =
new Array();
1075 var tagManagementMenuShareEvent =
new Array();
1077 var EndOfGroupping=
false;
1080 clickTagInLegend =
function(){
1081 if (! PaletteNodeTagFlag)
1082 if (emit_click(
"tag",this.
id))
1084 if(me.getRemovingTag()) {
1085 var tagToRemove = document.getElementById(this.
id);
1086 for(O in nodesByLoc) {
1087 nodesByLoc[O].removeElementFromNodeTagList(this.
id);
1089 $(
'#tag-notif').text(
"Tag " + this.
id +
" removed from tag list and tiles.");
1090 $(
'.tag#'+this.
id).remove();
1091 var idTag=globalTagsList.indexOf(this.
id)
1092 var name=globalTagsList[idTag];
1093 delete globalTagsColors[name];
1094 globalTagsList.splice(idTag,1);
1095 currentSelectedTag =
"";
1097 }
else if (me.getSelectTags()) {
1098 var tagToSelect = this.id;
1100 for (O in nodesById) {
1101 if (me.hasTag(nodesById[O], tagToSelect)) {
1102 var HB = $(
'#hitbox' + nodesById[O].getId());
1103 nodeSelect(nodesById[O],HB);
1108 $(
'#tag-notif').text(
"No matching tiles for tag " + tagToSelect +
" found");
1110 $(
'#tag-notif').text(w +
" matching tiles for tag " + tagToSelect +
" found");
1114 }
else if (me.getAlignTags()) {
1115 var thisTagToGroup = this.id;
1118 var hasFloatingT=
false
1119 for (O in nodesById) {
1120 if (me.hasTag(nodesById[O], thisTagToGroup)) {
1121 if (me.hasFloatingTag(nodesById[O], thisTagToGroup)) {
1123 floatT[w]=[nodesById[O].getFloatingTag()[thisTagToGroup][
"val"],O,nodesById[O].getId()];
1125 mesh.switchLocation(nodesById[O], nodesByLoc[w],
false,
true);
1131 var sfloatT = Array.from(floatT);
1132 if (alignOrderTag) {
1133 sfloatT.sort((a, b) => a[0] - b[0]);
1135 sfloatT.sort((a, b) => b[0] - a[0]);
1137 for (var w=0; w<sfloatT.length;w++) {
1138 var O=sfloatT[w][1];
1139 mesh.switchLocation(nodesById[O], nodesByLoc[w],
false,
true);
1144 $(
'#tag-notif').text(
"No matching tiles for tag " + thisTagToGroup +
" found");
1146 $(
'#tag-notif').text(w +
" matching tiles for tag " + thisTagToGroup +
" found");
1150 if(chargeAllContentOnStart==
false) {
1151 me.computeNumColumns();
1152 for(O in nodesById){
1153 node = nodesById[O];
1154 if( node.getLoadedStatus() ==
false && mesh.locationProvider(node.getIdLocation()).getY()<window.innerHeight ) {
1156 ratio=mesh.loadContent(node.getId());
1161 for (O in nodesByLoc) {
1162 if (nodesByLoc[O].getNodeInViewportStatus()) {
1164 SetOn(nodesByLoc[O].getId());
1166 SetOff(nodesByLoc[O].getId());
1169 EndOfGroupping=
true;
1171 }
else if (me.getHideNodesTagFlag()) {
1172 var thisTagToGroup = this.id;
1173 if (me.getHideNodesTag()) {
1175 for (O in nodesByLoc) {
1176 if (me.hasTag(nodesByLoc[O], thisTagToGroup)) {
1177 Id=nodesByLoc[O].getId();
1181 $(
'#tag-notif').text(
"Hiding the tiles bearing " + thisTagToGroup +
" tag. (To make them visible again, click on the icon in the tag menu, then on the tag again)")
1185 var thisTagToGroup = this.id;
1186 for (O in nodesByLoc) {
1187 if (me.hasTag(nodesByLoc[O], thisTagToGroup)) {
1188 Id=nodesByLoc[O].getId();
1192 $(
'#tag-notif').text(
"Showing the tiles bearing " + thisTagToGroup +
" tag.")
1195 }
else if (KillNodesTagFlag) {
1196 var tagToKill = this.id;
1198 for (O in nodesByLoc) {
1199 if (me.hasTag(nodesByLoc[O], tagToKill)) {
1200 Id=nodesByLoc[O].getId();
1204 nodesByLoc[O].removeElementFromNodeTagList(tagToKill);
1205 nodeEnd=nodesByLoc[nodeCardinal];
1206 mesh.switchLocationShiftColumnLine(nodesByLoc[O],nodeEnd,
false,
false);
1207 nodesByLoc.splice(nodeCardinal,1);
1211 $(
'#tag-notif').text(
"Killing the tiles bearing " + tagToKill +
" tag.")
1212 $(
'.tag#'+tagToKill).remove();
1214 }
else if (SelectionNodeToTagFlag) {
1215 currentSelectedTag = this.id;
1217 var listSelectionTiles=me.getSelectedNodes()
1218 for(O in listSelectionTiles) {
1219 var HBid =
"hitbox"+listSelectionTiles[O].getId();
1221 listSelectionTiles[O].getStickers().addSticker(currentSelectedTag, attributedTagsColorsArray[currentSelectedTag],
true);
1222 listSelectionTiles[O].addElementToNodeTagList(currentSelectedTag);
1224 $(
'#tag-notif').text(
" Add selected tiles to tag " + this.
id);
1227 }
else if (SelectionMultipleTagsFlag) {
1228 var thisTag = this.id;
1230 var color = attributedTagsColorsArray[received_newtag];
1231 var newSelTagDiv = document.getElementById(received_newtag);
1232 var funSelTag =
function() {
1233 if (receive_Add_Tag) {
1234 clearInterval(checkEndaddSelTag);
1236 addBlink(newSelTagDiv);
1238 for (O in nodesById) {
1239 if (me.hasTag(nodesById[O], thisTag)) {
1240 nodesById[O].getStickers().addSticker(received_newtag,color);
1241 nodesById[O].addElementToNodeTagList(received_newtag);
1244 $(
'#tag-notif').text(
" Add tiles from tag " + thisTag +
" to selection tag " + received_newtag);
1247 var checkEndaddSelTag = setInterval(funSelTag, 100);
1249 }
else if (PaletteNodeTagFlag) {
1250 var tagToColor = this.id;
1252 var defaultColor = colourNameToHex(configBehaviour.draw.defaultColor);
1253 colorChoose = document.querySelector(
"#colorChoose");
1254 colorChoose.value = defaultColor;
1256 $(
'#'+tagToColor).css(
"outline-style",
"solid");
1258 var TagColor = defaultColor;
1260 window[
"updateFirst"+tagToColor] =
function (event) {
1261 TagColor =
event.target.value;
1263 window[
"updateAll"+tagToColor] =
function (event) {
1264 $(
'#'+tagToColor).css(
"outline-style",
"none");
1265 cdata={
"room":my_session,
"OldTag":tagToColor,
"TagColor":TagColor};
1266 socket.emit(
"color_Tag", cdata, callback=
function(sdata){
1267 console.log(
"socket change color Tag ", cdata);
1269 colorChoose.removeEventListener(
"input", window[
"updateFirst"+tagToColor]);
1270 colorChoose.removeEventListener(
"change", window[
"updateAll"+tagToColor]);
1271 delete window[
"updateFirst"+tagToColor];
1272 delete window[
"updateAll"+tagToColor];
1275 colorChoose.addEventListener(
"input", window[
"updateFirst"+tagToColor],
false);
1276 colorChoose.addEventListener(
"change", window[
"updateAll"+tagToColor],
false);
1277 colorChoose.select();
1280 if (currentSelectedTag != this.
id) {
1281 $(
'#'+this.
id).css(
"outline",
"10px solid white");
1282 $(
'#'+this.
id).css(
"z-index", 500);
1283 if (currentSelectedTag !=
"") {
1284 $(
'#'+currentSelectedTag).css(
"outline-style",
"none");
1285 $(
'#'+currentSelectedTag).css(
"z-index", 149);
1287 currentSelectedTag = this.id;
1288 $(
'#tag-notif').text(
"Selected tag: " + currentSelectedTag +
";Â you may now click on the left border of a tile to give it the tag.");
1292 $(
'#'+this.
id).css(
"outline-style",
"none");
1293 $(
'#'+this.
id).css(
"z-index", 149);
1294 currentSelectedTag =
"";
1295 $(
'#tag-notif').text(
"No selected tag.");
1302 clickSticker =
function(){
1304 if (emit_click(
"sticker",this.
id))
1306 var splittedId = this.
id.split(
"_");
1307 var nodeId = splittedId.pop();
1308 var node = nodesById[
"node"+nodeId];
1309 node.removeElementFromNodeTagList(splittedId.join(
"_"));
1313 this.AddNewTag=
function(tmpNewTag) {
1315 if ( $.inArray(tmpNewTag, globalTagsList) == -1 ) {
1316 globalTagsList.push(tmpNewTag);
1317 var k = globalTagsList.length -1;
1319 globalTagsColors[tmpNewTag]={
"l":l};
1321 var k = globalTagsList.indexOf(tmpNewTag);
1322 var l = globalTagsColors[tmpNewTag][
"l"];
1324 $(
'#tag-legend').append(
'<div id =' + globalTagsList[k] +
' class=tag>' + globalTagsList[k] +
'</div>');
1325 var thisNewTagFun=
function() {
1327 var A=$(
'#'+globalTagsList[k]).position();
1328 clearInterval(TagPosFun);
1330 if ($(
'#'+globalTagsList[k]).position().left==0) {
1331 $(
"#tag-legend").css({ height: $(
"#tag-legend").height()+$(
'#'+globalTagsList[k]).height() });
1334 $(
'#'+globalTagsList[k]).css(
'background-color',ColorSticker(l));
1335 attributedTagsColorsArray[globalTagsList[k]] =$(
'#'+globalTagsList[k]).css(
"background-color");
1336 $(
'#tag-notif').text(
"New tag added: " + tmpNewTag);
1339 $(
'#tag-legend div:last').remove();
1340 console.log(
"Tag not valid", tmpNewTag);
1341 $(
'#tag-notif').text(
"Invalid tag: " + tmpNewTag +
", please try again.");
1344 TagHeight=($(
"#tag-legend").height());
1346 if ( my_user !=
"Anonymous" ) {
1348 htmlPrimaryParent.css(
"marginTop",TopPP+
"px");
1351 $(
'.tag').off(
"click").on({
1352 click : clickTagInLegend
1358 var TagPosFun = setInterval( thisNewTagFun, 100);
1362 this.ChangeColorTag =
function(thisTag, NewColor) {
1363 $(
'#'+thisTag).css(
'background-color',NewColor);
1364 attributedTagsColorsArray[thisTag] = NewColor;
1365 for (O in nodesByLoc) {
1366 if (me.hasTag(nodesByLoc[O], thisTag)) {
1367 nodesByLoc[O].getStickers().colorSticker(thisTag,NewColor);
1374 this.disableOtherTagFunction =
function (mytagfunction) {
1375 var ListTagFunction=[
"AlignTags",
"HideNodesTagFlag",
"KillNodesTagFlag",
"SelectTags",
"SelectionTag",
"SelectMultipleTags"];
1376 for (var otherTag in ListTagFunction) {
1377 var thisTag=ListTagFunction[otherTag];
1378 if ( thisTag != mytagfunction )
1379 eval(
"me.set"+thisTag+
"(false)");
1381 eval(
"me.set"+mytagfunction+
"(true)");
1385 tagMenuTitleTab.push(
"Align/group similarly tagged nodes")
1386 tagMenuEventTab.push(
function(v,
id, optionNumber){
1389 me.disableOtherTagFunction(
"AlignTags");
1390 me.setAlignTags(
true);
1391 $(
'#'+
id+
'option'+optionNumber).removeClass(
'alignTagButtonIcon').addClass(
'closeAlignTagButtonIcon');
1394 me.setAlignTags(
false);
1395 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeAlignTagButtonIcon').addClass(
'alignTagButtonIcon');
1398 tagMenuIconClassAttributesTab.push(
"alignTagButtonIcon");
1399 tagMenuShareEvent.push(
true);
1402 tagMenuTitleTab.push(
"Order floatting tagged nodes")
1403 tagMenuEventTab.push(
function(v,
id, optionNumber){
1406 $(
'#'+
id+
'option'+(optionNumber-1)).click();
1408 .css(
"top",menuTags.position()[
"top"]+200)
1409 .css(
"left",$(
'.alignOrderTagsMenuButtonIcon').position()[
"left"]+menuTags.position()[
"left"])
1410 .css(
"visibility",
"visible");
1411 $(
'#'+
id+
'option'+optionNumber).removeClass(
'alignOrderTagsMenuButtonIcon').addClass(
'closeAlignOrderTagsMenuButtonIcon');
1414 menuAlignOrderTags.css(
"visibility",
"hidden");
1415 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeAlignOrderTagsMenuButtonIcon').addClass(
'alignOrderTagsMenuButtonIcon');
1418 tagMenuIconClassAttributesTab.push(
"alignOrderTagsMenuButtonIcon");
1419 tagMenuShareEvent.push(
true);
1421 tagAlignOrderTagsMenuTitleTab.push(
"Increasing sort")
1422 tagAlignOrderTagsMenuEventTab.push(
function(v,
id, optionNumber){
1423 me.disableOtherTagFunction(
"AlignTags");
1424 me.setAlignTags(
true);
1427 $(
'#'+
id+
'option'+optionNumber).removeClass(
'increaseOrderTagsButtonIcon').addClass(
'closeIncreaseOrderTagsButtonIcon');
1428 $(
'#'+
id+
'option'+(optionNumber+1)).removeClass(
'decreaseOrderTagsButtonIcon').addClass(
'closeDecreaseOrderTagsButtonIcon');
1432 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeIncreaseOrderTagsButtonIcon').addClass(
'increaseOrderTagsButtonIcon');
1433 $(
'#'+
id+
'option'+(optionNumber+1)).removeClass(
'closeDecreaseOrderTagsButtonIcon').addClass(
'decreaseOrderTagsButtonIcon');
1437 tagAlignOrderTagsMenuIconClassAttributesTab.push(
'increaseOrderTagsButtonIcon')
1438 tagAlignOrderTagsMenuShareEvent.push(
true);
1440 tagAlignOrderTagsMenuTitleTab.push(
"Decreasing sort")
1441 tagAlignOrderTagsMenuEventTab.push(
function(v,
id, optionNumber){
1442 me.disableOtherTagFunction(
"AlignTags");
1443 me.setAlignTags(
true);
1446 $(
'#'+
id+
'option'+optionNumber).removeClass(
'decreaseOrderTagsButtonIcon').addClass(
'closeDecreaseOrderTagsButtonIcon');
1447 $(
'#'+
id+
'option'+(optionNumber-1)).removeClass(
'increaseOrderTagsButtonIcon').addClass(
'closeIncreaseOrderTagsButtonIcon');
1451 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeDecreaseOrderTagsButtonIcon').addClass(
'decreaseOrderTagsButtonIcon');
1452 $(
'#'+
id+
'option'+(optionNumber-1)).removeClass(
'closeIncreaseOrderTagsButtonIcon').addClass(
'increaseOrderTagsButtonIcon');
1456 tagAlignOrderTagsMenuIconClassAttributesTab.push(
'decreaseOrderTagsButtonIcon')
1457 tagAlignOrderTagsMenuShareEvent.push(
true);
1462 tagMenuTitleTab.push(
"Hide/Show nodes with tags menu")
1463 tagMenuEventTab.push(
function(v,
id, optionNumber){
1466 .css(
"top",menuTags.position()[
"top"]+200)
1467 .css(
"left",$(
'.hideTagsMenuButtonIcon').position()[
"left"]+menuTags.position()[
"left"])
1468 .css(
"visibility",
"visible");
1469 $(
'#'+
id+
'option'+optionNumber).removeClass(
'hideTagsMenuButtonIcon').addClass(
'closeHideTagsMenuButtonIcon');
1471 me.tagHideTagsMenu.closeAllOptions();
1472 menuHideTags.css(
"visibility",
"hidden");
1473 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeHideTagsMenuButtonIcon').addClass(
'hideTagsMenuButtonIcon');
1476 tagMenuIconClassAttributesTab.push(
"hideTagsMenuButtonIcon");
1477 tagMenuShareEvent.push(
true);
1479 tagHideTagsMenuTitleTab.push(
"Hide nodes")
1480 tagHideTagsMenuEventTab.push(
function(v,
id, optionNumber){
1483 me.disableOtherTagFunction(
"HideNodesTagFlag");
1484 me.setHideNodesTagFlag(
true);
1485 me.setHideNodesTag(
true);
1486 $(
'#'+
id+
'option'+optionNumber).removeClass(
'hideTagsButtonIcon').addClass(
'closeHideTagsButtonIcon');
1489 me.setHideNodesTagFlag(
false);
1490 me.setHideNodesTag(
false);
1491 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeHideTagsButtonIcon').addClass(
'hideTagsButtonIcon');
1494 tagHideTagsMenuIconClassAttributesTab.push(
'hideTagsButtonIcon')
1495 tagHideTagsMenuShareEvent.push(
true);
1497 tagHideTagsMenuTitleTab.push(
"Show nodes")
1498 tagHideTagsMenuEventTab.push(
function(v,
id, optionNumber){
1501 me.setHideNodesTagFlag(
true);
1502 me.setHideNodesTag(
false);
1503 $(
'#'+
id+
'option'+optionNumber).removeClass(
'showTagsButtonIcon').addClass(
'closeShowTagsButtonIcon');
1506 me.disableOtherTagFunction(
"HideNodesTagFlag");
1507 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeShowTagsButtonIcon').addClass(
'showTagsButtonIcon');
1508 me.setHideNodesTagFlag(
false);
1509 me.setHideNodesTag(
true);
1512 tagHideTagsMenuIconClassAttributesTab.push(
'showTagsButtonIcon')
1513 tagHideTagsMenuShareEvent.push(
true);
1516 tagMenuTitleTab.push(
"Kill tiles with selected tag")
1517 tagMenuEventTab.push(
function(v,
id, optionNumber){
1520 me.disableOtherTagFunction(
"KillNodesTagFlag");
1521 $(
'#'+
id+
'option'+optionNumber).removeClass(
'KillTagButtonIcon').addClass(
'closeKillTagButtonIcon');
1523 mesh.globalLocationProvider();
1524 me.setKillNodesTagFlag(
false);
1526 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeKillTagButtonIcon').addClass(
'KillTagButtonIcon');
1529 tagMenuIconClassAttributesTab.push(
"KillTagButtonIcon");
1530 tagMenuShareEvent.push(
true);
1533 tagMenuTitleTab.push(
"Selection menu.")
1534 tagMenuEventTab.push(
function(v,
id, optionNumber){
1537 .css(
"top",menuTags.position()[
"top"]+200)
1538 .css(
"left",$(
'.selectTagMenuButtonIcon').position()[
"left"]+menuTags.position()[
"left"])
1539 .css(
"visibility",
"visible");
1540 $(
'#'+
id+
'option'+optionNumber).removeClass(
'selectTagMenuButtonIcon').addClass(
'closeSelectTagMenuButtonIcon');
1542 me.tagSelectionMenu.closeAllOptions();
1543 menuSelectionTags.css(
"visibility",
"hidden");
1544 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeSelectTagMenuButtonIcon').addClass(
'selectTagMenuButtonIcon');
1547 tagMenuIconClassAttributesTab.push(
"selectTagMenuButtonIcon");
1548 tagMenuShareEvent.push(
true);
1551 tagSelectionMenuTitleTab.push(
"Select tiles with a tag.")
1552 tagSelectionMenuEventTab.push(
function(v,
id, optionNumber){
1555 me.disableOtherTagFunction(
"SelectTags");
1556 $(
'#'+
id+
'option'+optionNumber).removeClass(
'selectTagButtonIcon').addClass(
'closeSelectTagButtonIcon');
1559 me.setSelectTags(
false);
1560 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeSelectTagButtonIcon').addClass(
'selectTagButtonIcon');
1563 tagSelectionMenuIconClassAttributesTab.push(
"selectTagButtonIcon");
1564 tagSelectionMenuShareEvent.push(
true);
1567 tagSelectionMenuTitleTab.push(
"Add tag for nodes in selection")
1568 tagSelectionMenuEventTab.push(
function(v,
id, optionNumber){
1571 me.disableOtherTagFunction(
"SelectionTag");
1572 $(
'#'+
id+
'option'+optionNumber).removeClass(
'selectionToTagButtonIcon').addClass(
'closeSelectionToTagButtonIcon');
1574 SelectionNodeToTagFlag=
false;
1575 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeSelectionToTagButtonIcon').addClass(
'selectionToTagButtonIcon');
1578 tagSelectionMenuIconClassAttributesTab.push(
"selectionToTagButtonIcon");
1579 tagSelectionMenuShareEvent.push(
true);
1583 tagSelectionMenuTitleTab.push(
"Select tiles with multiple tags.")
1584 tagSelectionMenuEventTab.push(
function(v,
id, optionNumber){
1587 me.disableOtherTagFunction(
"SelectMultipleTags");
1589 seltags=
"Sel"+SelTags.length;
1590 SelTags.push(seltags);
1591 console.log(
"select multiple tags : New Tag ",seltags);
1593 var upMenuTag=$(
'.closeSelectTagMenuButtonIcon')[0].id;
1594 emit_newTag(upMenuTag,seltags);
1596 $(
'#'+
id+
'option'+optionNumber).removeClass(
'selectMultipleTagsButtonIcon').addClass(
'closeSelectMultipleTagsButtonIcon');
1599 me.setSelectMultipleTags(
false);
1601 cdata={
"room":my_session,
"SelTags":seltags,
"bool":v};
1602 socket.emit(
"switch_MultipleTag", cdata, callback=
function(sdata){
1603 console.log(
"Emit switch multiple tags : ", cdata);
1606 tagSelectionMenuIconClassAttributesTab.push(
"selectMultipleTagsButtonIcon");
1607 tagSelectionMenuShareEvent.push(
false);
1609 socket.on(
'receive_multiple_Tags',
function(sdata){
1610 console.log(
"receive_multiple_Tags",sdata);
1611 if (Boolean(sdata.bool)) {
1612 me.disableOtherTagFunction(
"SelectMultipleTags");
1613 seltags=sdata.SelTags;
1614 $(
'.selectMultipleTagsButtonIcon').removeClass(
'selectMultipleTagsButtonIcon').addClass(
'closeSelectMultipleTagsButtonIcon');
1616 me.setSelectMultipleTags(
false);
1617 $(
'.closeSelectMultipleTagsButtonIcon').removeClass(
'closeSelectMultipleTagsButtonIcon').addClass(
'selectMultipleTagsButtonIcon');
1622 tagMenuTitleTab.push(
"Management menu.")
1623 tagMenuEventTab.push(
function(v,
id, optionNumber){
1626 .css(
"top",menuTags.position()[
"top"]+200)
1627 .css(
"left",$(
'.managementTagMenuButtonIcon').position()[
"left"]+menuTags.position()[
"left"])
1628 .css(
"visibility",
"visible");
1629 $(
'#'+
id+
'option'+optionNumber).removeClass(
'managementTagMenuButtonIcon').addClass(
'closeManagementTagMenuButtonIcon');
1631 me.tagManagementMenu.closeAllOptions();
1632 menuManagementTags.css(
"visibility",
"hidden");
1633 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeManagementTagMenuButtonIcon').addClass(
'managementTagMenuButtonIcon');
1636 tagMenuIconClassAttributesTab.push(
"managementTagMenuButtonIcon");
1637 tagMenuShareEvent.push(
true);
1640 tagManagementMenuTitleTab.push(
"Add new tag")
1641 tagManagementMenuEventTab.push(
function(v,
id, optionNumber){
1645 var tmp = document.getElementById(
"add-tag");
1647 menuTags.append(
"<div id=add-tag></div>");
1649 position:
"relative",
1654 width : parseInt($(me.tagMenu.getHtmlMenuSelector()).css(
'width')),
1655 backgroundColor :
"black",
1659 $(
'#add-tag').append(
"<label for=new-tag>Add Tag : </label>").append(
"<input id=new-tag type=text placeholder='New tag ?'>");
1661 position :
"relative",
1667 width : parseInt($(me.tagMenu.getHtmlMenuSelector()).css(
'width')),
1670 $(
'#new-tag').autocomplete({
1671 source: suggestion_list
1674 $(
'#add-tag').show();
1675 $(
'#new-tag').show();
1678 var left_ = parseInt($(me.menu.getHtmlMenuSelector()).css(
"width"));
1679 var width_= parseInt($(
'header').css(
'width')) - left_ -600 ;
1681 $(
'#add-tag').off(
"tap focusin click").on(
"tap focusin click",
1683 $(
'.tag').off(
"click");
1685 $(
'#add-tag').off(
"keypress").on({
1686 keypress :
function(e){
1687 if (e.which == 13 ) {
1688 if ( $(
'#new-tag').val().trim()!=
'') {
1689 var tmpNewTag = $(
'#new-tag').val().trim();
1690 tmpNewTag = newTag_conformance(tmpNewTag);
1691 if ($.inArray(tmpNewTag, globalTagsList) == -1) {
1692 console.log(
"add New Tag ", tmpNewTag);
1693 emit_newTag(
"add-tag",tmpNewTag);
1696 console.log(
"Tag already exists!");
1697 $(
'#tag-notif').text(
"This tag already exists!");
1699 $(
'#new-tag').val(
"");
1702 $(
'#menu'+
id+
">#option"+optionNumber).click();
1708 $(
'#add-tag').off(
"autocompleteselect").on(
"autocompleteselect",
function(event, ui) {
1709 document.getElementById(
"new-tag").value = ui.item.value;
1710 var myEvent = jQuery.Event(
"keypress");
1712 myEvent.keyCode = 13;
1713 $(
'#add-tag').trigger(myEvent);
1714 $(
'#new-tag').value =
"";
1720 $(
'#'+
id+
'option'+optionNumber).removeClass(
'addTagButtonIcon').addClass(
'closeAddTagButtonIcon');
1723 $(
'#add-tag').hide();
1724 $(
'#new-tag').hide();
1725 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeAddTagButtonIcon").addClass(
"addTagButtonIcon");
1729 tagManagementMenuIconClassAttributesTab.push(
"addTagButtonIcon");
1730 tagManagementMenuShareEvent.push(
false);
1733 tagManagementMenuTitleTab.push(
"Remove tag")
1734 tagManagementMenuEventTab.push(
function(v,
id, optionNumber){
1737 $(
'#'+
id+
'option'+optionNumber).removeClass(
"removeTagButtonIcon").addClass(
"closeRemoveTagButtonIcon");
1738 me.setRemovingTag(
true);
1741 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeRemoveTagButtonIcon").addClass(
"removeTagButtonIcon");
1742 me.setRemovingTag(
false);
1745 tagManagementMenuIconClassAttributesTab.push(
"removeTagButtonIcon");
1746 tagManagementMenuShareEvent.push(
true);
1749 tagManagementMenuTitleTab.push(
"Erase all the tags")
1750 tagManagementMenuEventTab.push(
function(v,
id, optionNumber){
1754 $(
"#tag-legend").prepend(
'<div id="validateDelTags" height="10%" width="20%" style="z-index: 100; color: yellow; font-size: 50"><h1>Are you sure you want to suppress all tags ?</h1></div>')
1759 $(
'#validateDelTags').append(
'<button id="validButtonYes" name="validButtonYes" class="validateDelTags btn btn-info" >Yes</button>');
1760 $(
'#validateDelTags').append(
' ');
1761 $(
'#validateDelTags').append(
'<button id="validButtonNo" name="validButtonNo" class="validateDelTags btn btn-info" >No</button>');
1762 $(
'#validButtonYes').off(
"click").on({
1764 click :
function() {
1765 if (emit_click(
"validateDelTags",
"validButtonYes"))
1767 while(globalTagsList.length>0) {
1768 delete globalTagsColors[globalTagsList[globalTagsList.length-1]];
1769 buffer=globalTagsList.pop();
1771 for(O in nodesById) {
1772 nodesById[O].removeElementFromNodeTagList(buffer);
1775 $(
'#tag-legend').children().remove();
1776 for (O in nodesByLoc)
1777 if (nodesByLoc[O].getNodeInViewportStatus()) {
1782 $(
'#validateDelTags').remove()
1785 $(
'#validButtonNo').off(
"click").on({
1786 click :
function() {
1787 if (emit_click(
"validateDelTags",
"validButtonNo"))
1789 $(
'#validateDelTags').remove()
1792 tagManagementMenuIconClassAttributesTab.push(
"brushButtonIcon");
1793 tagManagementMenuShareEvent.push(
true);
1796 tagManagementMenuTitleTab.push(
"Choose stickers color")
1797 tagManagementMenuEventTab.push(
function(v,
id, optionNumber){
1799 var defaultColor = colourNameToHex(configBehaviour.draw.defaultColor);
1800 $(
'#menu'+
id).append(
'<div id=color-picker-zone style="position: absolute; top: 200px; left: 1100px"></div>');
1801 $(
'#color-picker-zone').append(
'<label for="colorChoose" style="height: 200px; width: 400px; color: white; font-size: 4em">Color:</label>');
1802 $(
'#color-picker-zone').append(
'<input type="color" value="'+defaultColor+
'" id="colorChoose" style="height: 200px; width: 200px; font-size: 2em">');
1803 PaletteNodeTagFlag=
true;
1804 $(
'#'+
id+
'option'+optionNumber).removeClass(
'paletteButtonIcon').addClass(
'closePaletteButtonIcon');
1806 $(
'#color-picker-zone').remove();
1807 PaletteNodeTagFlag=
false;
1808 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closePaletteButtonIcon').addClass(
'paletteButtonIcon');
1811 tagManagementMenuIconClassAttributesTab.push(
"paletteButtonIcon");
1812 tagManagementMenuShareEvent.push(
false);
1817 var actionGlobalMenuTitleTab =
new Array();
1818 var actionGlobalMenuEventTab =
new Array();
1819 var actionGlobalMenuIconClassAttributesTab =
new Array();
1820 var actionGlobalMenuShareEvent =
new Array();
1822 for ( var TS in json_actions) {
1823 for ( var thisAction in json_actions[TS]) {
1824 var FuncName=json_actions[TS][thisAction][0];
1825 var IconName=json_actions[TS][thisAction][1];
1826 actionGlobalMenuTitleTab.push(TS+
"_"+FuncName);
1827 actionGlobalMenuEventTab.push( (
function() {
1829 var thisAction_=thisAction;
1830 return function( v, id, optionNumber){
1831 idAction = parseInt(thisAction_.replace(
"action",
""));
1833 var selections = [];
1834 var listSelectionTiles=me.getNodesToZoom();
1835 for(O in listSelectionTiles) {
1837 if (listSelectionTiles[O].getJsonData().tags.filter(x=>x==TS_).length)
1838 selections.push(parseInt(listSelectionTiles[O].getJsonData().variable.replace(
"ID-",
""))-1);
1840 if (selections.length == 0)
1843 selections=selections.toString()
1844 addBlink($(
'#'+
id+
"option"+optionNumber));
1845 cdata={
"room":my_session,
"id":id,
"TileSet":TS_,
"action":thisAction_,
"selections":selections};
1846 socket.emit(
"action_click", cdata, callback=
function(sdata){
1847 console.log(
"socket send action_click ", cdata);
1851 actionGlobalMenuIconClassAttributesTab.push(TS+
"_"+IconName+
"ButtonIcon");
1852 actionGlobalMenuShareEvent.push(
false);
1865 var drawMenuTitleTab =
new Array();
1866 var drawMenuEventTab =
new Array();
1867 var drawMenuIconClassAttributesTab =
new Array();
1868 var drawMenuShareEvent =
new Array();
1871 drawMenuTitleTab.push(
"Choose drawing color")
1872 drawMenuEventTab.push(
function(v,
id, optionNumber){
1874 var defaultColor = colourNameToHex(configBehaviour.draw.defaultColor);
1875 $(
'#menu'+
id).append(
'<div id=color-picker-zone style="position: absolute; top: 0px; left: 1100px"></div>');
1876 $(
'#color-picker-zone').append(
'<label for="colorChoose" style="height: 200px; width: 400px; color: white; font-size: 4em">Color:</label>');
1877 $(
'#color-picker-zone').append(
'<input type="color" value="'+defaultColor+
'" id="colorChoose" style="height: 200px; width: 200px; font-size: 2em">');
1879 colorChoose = document.querySelector(
"#colorChoose");
1880 colorChoose.value = defaultColor;
1881 colorChoose.addEventListener(
"input", updateFirst,
false);
1882 colorChoose.addEventListener(
"change", updateAll,
false);
1883 colorChoose.select();
1885 drawingColor = defaultColor;
1887 function updateFirst(event) {
1888 drawingColor =
event.target.value;
1890 function updateAll(event) {
1891 drawingColor =
event.target.value;
1894 $(
'#'+
id+
'option'+optionNumber).removeClass(
'paletteButtonIcon').addClass(
'closePaletteButtonIcon');
1896 $(
'#color-picker-zone').remove();
1897 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closePaletteButtonIcon').addClass(
'paletteButtonIcon');
1900 drawMenuIconClassAttributesTab.push(
"paletteButtonIcon");
1901 drawMenuShareEvent.push(
false);
1904 drawMenuTitleTab.push(
"Choose line width !")
1905 drawMenuEventTab.push(
function(v,
id, optionNumber){
1908 $(
'#menu'+
id).append(
"<input name=lineWidthSelector id=lineWidthSelector min=0 type=number>");
1909 $(
'#lineWidthSelector').css({
1910 position :
"absolute",
1911 top : parseInt($(
'#'+
id+
'option'+optionNumber).css(
"height")),
1912 left : parseInt($(
'#'+
id+
'option'+optionNumber).css(
"left")),
1913 width : parseInt($(
'#'+
id+
'option'+optionNumber).css(
"width")),
1915 $(
'#lineWidthSelector').val(configBehaviour.draw.width);
1917 var changeLineWidth =
function(){
1918 configBehaviour.draw.width = $(
'#lineWidthSelector').val();
1922 $(
'#lineWidthSelector').off(
"change").on({
1923 change : changeLineWidth
1926 $(
'#'+
id+
'option'+optionNumber).removeClass(
'lineWidthButtonIcon').addClass(
'closeLineWidthButtonIcon');
1929 $(
'#lineWidthSelector').remove();
1930 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeLineWidthButtonIcon").addClass(
"lineWidthButtonIcon");
1933 drawMenuIconClassAttributesTab.push(
"lineWidthButtonIcon");
1934 drawMenuShareEvent.push(
false);
1937 drawMenuTitleTab.push(
"Brush icon : to erase the drawing")
1938 drawMenuEventTab.push(
function(v,
id, optionNumber){
1939 context.clearRect(0, 0, context.canvas.width, context.canvas.height);
1940 clickX =
new Array();
1941 clickY =
new Array();
1942 clickDrag =
new Array();
1945 drawMenuIconClassAttributesTab.push(
"brushButtonIcon");
1946 drawMenuShareEvent.push(
false);
1949 drawMenuTitleTab.push(
"Save drawing")
1950 drawMenuEventTab.push(
function(v,
id, optionNumber){
1951 var canvasName = $(
'#zoomSupport').find(
".drawing").filter(
":visible").attr(
"id");
1952 var srcImage = $(
'#iframe' + canvasName.replace(/\D/g,
"")).attr(
"src").replace(
".png",
"").replace(/^.*[\\\/]/,
"");
1953 document.getElementById(canvasName).toBlob(
function(blob) {
1954 saveAs(blob,
"drawing_"+ srcImage +
".png");
1957 drawMenuIconClassAttributesTab.push(
"saveButtonIcon");
1958 drawMenuShareEvent.push(
false);
1960 var DrawBlobs =
new Map();
1962 var getBlob =
function (canvasName) {
1963 var deferred = Q.defer();
1965 var canvas = document.getElementById(canvasName);
1966 if ( $(
"#DrawSupport").length == 0)
1967 $(
"body").append(
'<div id="DrawSupport" style="width: '+canvas.width+
'px; height: '+canvas.height+
'px"></div>');
1969 canvas.toBlob(
function(blob) {
1971 var nodeId=canvasName.replace(/drawCanvas/g,
"");
1973 var thisDrawBlob=DrawBlobs.get(nodeId);
1974 if ( thisDrawBlob ) {
1975 var newImg = thisDrawBlob.image;
1976 $(
'#'+newImg.id).remove();
1977 var OldUrl = thisDrawBlob.url;
1980 window.URL.revokeObjectURL(OldUrl);
1983 var BlobUrl = window.URL.createObjectURL(blob);
1984 newImg.src = BlobUrl;
1985 $(
'#DrawSupport').append(newImg);
1986 thisDrawBlob.url = BlobUrl;
1987 thisDrawBlob.dataurl = canvas.toDataURL();
1988 $(
'#'+newImg.id).show();
1990 var newImg = document.createElement(
'img');
1991 BlobUrl = window.URL.createObjectURL(blob);
1993 newImg.id=canvasName+
'_img';
1994 newImg.src = BlobUrl;
1995 $(
'#DrawSupport').append(newImg);
1997 DrawBlobs.set(nodeId,{
1999 dataurl: canvas.toDataURL(),
2000 nodeId: parseInt(nodeId),
2002 canvasName: canvasName,
2006 thisDrawBlob=DrawBlobs.get(nodeId);
2007 deferred.resolve(thisDrawBlob);
2010 return deferred.promise;
2013 var DrawNodeFun =
function(nodeId,Id) {
2014 var Id=parseInt(Id);
2017 var thisDrawBlob=DrawBlobs.get(nodeId);
2018 var canvasName=thisDrawBlob.canvasName;
2020 var DrawNodeId=canvasName+
"_img_"+Id;
2021 if (thisDrawBlob.listNodeImg.indexOf(Id) > -1) {
2022 $(
"#"+DrawNodeId).remove();
2025 thisDrawBlob.listNodeImg.push(Id);
2027 LocImg=$(
"#"+canvasName+
"_img").clone().attr(
'id', DrawNodeId).appendTo($(
"#"+Id));
2029 position:
"absolute",
2032 height: $(
'#'+canvasName+
'_img').css(
'height'),
2033 width: $(
'#'+canvasName+
'_img').css(
'width'),
2036 var scaleX=(spread.X/ $(
'#'+canvasName+
'_img').css(
'width').replace(
'px',
''));
2037 var scaleY=(spread.Y/ $(
'#'+canvasName+
'_img').css(
'height').replace(
'px',
''));
2039 LocImg.css({
'-webkit-transform':
"scale("+scaleX+
","+ scaleY +
")",
2040 '-webkit-transform-origin':
'0 0',
2041 '-moz-transform':
"scale("+scaleX+
","+ scaleY +
")",
2042 '-moz-transform-origin':
'0 0',
2043 '-o-transform':
"scale("+scaleX+
","+ scaleY +
")",
2044 '-o-transform-origin':
'0 0',
2045 '-ms-transform':
"scale("+scaleX+
","+ scaleY +
")",
2046 'transform':
"scale("+scaleX+
","+ scaleY +
")",
2047 'transform-origin':
"0 0 0"});
2050 var chunk_size=1024*64;
2051 var send_draw_data =
function(data,nodeId,canvasName,offset,offsetEnd) {
2052 var datasend=data.slice(offset,offsetEnd+1).toString();
2055 cdata[
"room"]=my_session;
2056 cdata[
"nodeId"]=nodeId;
2057 cdata[
"offset"]=offset;
2058 cdata[
"offsetEnd"]=offsetEnd;
2059 cdata[
"data"]=datasend;
2060 socket.emit(
"uploadDraw", cdata, callback=
function(sdata){
2065 var send_DrawBlob =
function(thisDrawBlob, canvasName, nodeId, allNodes) {
2066 var canvas = document.getElementById(canvasName);
2067 var ImageData=thisDrawBlob.dataurl;
2068 var lengthData=ImageData.length;
2070 var nbsend = parseInt(lengthData / chunk_size) + 1;
2071 cdata[
"room"]=my_session;
2072 cdata[
"nodeId"]=nodeId;
2073 cdata[
"canvasName"]=canvasName;
2074 cdata[
"length"]=lengthData;
2075 cdata[
"nbsend"]=nbsend;
2076 cdata[
"width"]=canvas.width;
2077 cdata[
"height"]=canvas.height;
2078 if (typeof allNodes ==
'undefined') {
2080 socket.emit(
"drawBlob", cdata, callback=
function(sdata){
2081 console.log(
"socket send draw blob ", cdata);
2085 cdata[
"allNodes"]=
"true";
2086 socket.emit(
"drawBlob", cdata, callback=
function(sdata){
2087 console.log(
"socket send all clients draw blob ", cdata);
2102 for( var i=0; i<nbsend; i++ ) {
2103 var offset=i*chunk_size;
2104 var offsetEnd=Math.min(offset-1+chunk_size,lengthData-1)
2105 send_draw_data(ImageData,nodeId,canvasName,offset,offsetEnd);
2114 drawMenuTitleTab.push(
"Node drawing")
2115 drawMenuEventTab.push(
function(v,
id, optionNumber){
2116 var canvasName = $(
'#zoomSupport').find(
".drawing").filter(
":visible").attr(
"id");
2117 var nodeId=canvasName.replace(/drawCanvas/g,
"");
2118 var thisDrawBlob=[];
2120 getBlob(canvasName).then(
function(thisDrawBlob) {
2123 nbsend=send_DrawBlob(thisDrawBlob, canvasName, nodeId)
2125 console.log(
"Error : init send draw "+err.toString())
2128 }).then(
function(thisDrawBlob) {
2129 var newImg = thisDrawBlob.image;
2130 console.log(
"blob",thisDrawBlob);
2132 newImg.onload =
function() {
2134 DrawNodeFun(nodeId,nodeId);
2135 $(
'#'+this.
id).hide();
2138 $(
'#buttonUnzoom').click();
2142 drawMenuIconClassAttributesTab.push(
"DrawOnNodeButtonIcon");
2143 drawMenuShareEvent.push(
false);
2147 drawMenuTitleTab.push(
"Duplicate draw on other nodes")
2148 drawMenuEventTab.push(
function(v,
id, optionNumber){
2149 var canvasName = $(
'#zoomSupport').find(
".drawing").filter(
":visible").attr(
"id");
2150 var nodeId=canvasName.replace(/drawCanvas/g,
"");
2152 getBlob(canvasName).then(
function(thisDrawBlob) {
2154 nbsend=send_DrawBlob(thisDrawBlob, canvasName, nodeId,
true)
2156 console.log(
"Error : init send draw "+err.toString())
2159 }).then(
function(thisDrawBlob) {
2161 var newImg = thisDrawBlob.image;
2162 console.log(
"blob",thisDrawBlob);
2164 newImg.onload =
function() {
2166 for(O in nodesByLoc) {
2167 DrawNodeFun(nodeId,O);
2170 $(
'#'+this.
id).hide();
2173 $(
'#buttonUnzoom').click();
2177 drawMenuIconClassAttributesTab.push(
"DrawOnAllNodesIcon");
2178 drawMenuShareEvent.push(
false);
2181 socket.on(
'receive_draw_img',
function(sdatai){
2182 console.log(
"receive_draw_img",sdatai);
2184 var canvasName = sdatai.canvasName;
2185 var nodeId = sdatai.nodeId;
2188 $(
"#notifications").html(
"")
2189 $(
"#notifications").append(
'<div id="ProgressStatusUpload" class="progress-status">'+
2190 '<div id="myprogressBarUp" class="progressBar" style="width: 0px"></div></div>')
2191 $(
"#ProgressStatusUpload").show();
2194 var update_progressBarUp =
function() {
2195 if (sendProgress>100) clearInterval(idProgress);
2196 $(
"#myprogressBarUp").css({width: sendProgress+
"%"});
2197 $(
"#myprogressBarUp").html(sendProgress +
'%');
2199 var idProgress=setInterval(update_progressBarUp,10);
2201 if ( $(
"#DrawSupport").length == 0)
2202 $(
"body").append(
'<div id="DrawSupport" style="width: '+sdatai.width+
'px; height: '+sdatai.height+
'px"></div>');
2205 socket.off(
'receive_draw_part').on(
'receive_draw_part',
function(sdatap){
2211 receivedata=sdatap.data;
2215 data=data+receivedata;
2217 offset=parseInt(sdatap.offset);
2218 offsetend=parseInt(sdatap.offsetEnd);
2219 datalength=data.length;
2221 sendProgress=parseInt((offsetend+1)*100/sdatai.length);
2223 if (offsetend == sdatai.length-1) {
2224 socket.off(
'receive_draw_part');
2228 if ( $(
'#'+canvasName+
'_img').length == 0 )
2229 $(
"#DrawSupport").append(
'<img id="'+canvasName+
'_img" src=""'+
2230 ' width='+sdatai.width+
' height='+sdatai.height+
'></img>')
2231 var newImg=$(
"#"+canvasName+
"_img")[0];
2232 var thisDrawBlob=DrawBlobs.get(nodeId);
2234 if ( thisDrawBlob ) {
2235 newImg = thisDrawBlob.image;
2236 $(
"#"+newImg.id).remove();
2237 var OldUrl = thisDrawBlob.url;
2240 window.URL.revokeObjectURL(OldUrl);
2243 $(
"#DrawSupport").append(newImg);
2245 $(
'#'+newImg.id).show();
2249 DrawBlobs.set(nodeId,{
2251 dataurl: newImg.src,
2252 nodeId: parseInt(nodeId),
2254 canvasName: canvasName,
2259 if ( $(
'#'+canvasName).length > 0 ) {
2260 var canvas = document.getElementById(canvasName);
2261 var ctx = canvas.getContext(
'2d');
2262 ctx.drawImage(newImg, 0, 0);
2265 newImg.onload =
function() {
2266 if (sdatai.allNodes) {
2267 for(O in nodesByLoc) {
2268 DrawNodeFun(nodeId,O);
2271 DrawNodeFun(nodeId,nodeId);
2277 $(
"#ProgressStatusUpload").remove();
2279 offset=parseInt(sdatap.offsetEnd);
2292 var MSMenuTitleTab =
new Array();
2293 var MSMenuEventTab =
new Array();
2294 var MSMenuIconClassAttributesTab =
new Array();
2295 var MSMenuShareEvent =
new Array();
2305 MSMenuTitleTab.push(
"Apply MS on selection")
2306 MSMenuEventTab.push(
function(
id, optionNumber){
2308 var handleMaster,Handled;
2315 var nodeMSTab = me.getNodesToZoom();
2316 var ratio =spread.Y/spread.X;
2317 var initSpread = spread;
2319 if(nodeMSTab.length>0) {
2320 menuMS.css(
"visibility",
"hidden");
2323 nodeMSTab=Array(nodeMSTab[0]).concat(nodeMSTab);
2324 if (parseBool(configBehaviour.onlyMasterMS))
2325 configBehaviour.allMSShowMax=0;
2326 if (nodeMSTab.length > configBehaviour.allMSShowMax+1) {
2327 nodeMSTab_=nodeMSTab.slice(0, configBehaviour.allMSShowMax+1);
2328 me.magnifyingGlass(nodeMSTab_,ratio,initSpread);
2330 me.magnifyingGlass(nodeMSTab,ratio,initSpread);
2334 handleMaster=$(
"#Zoomed"+0);
2337 $(
"#zoomSupport").append(
'<div id=Handled class=handled></div>');
2339 iframeHandled=handleMaster.children(
"iframe");
2340 handleMaster.children(
".info").html(
"MASTER Tile");
2341 handleMaster.children(
".stickers_zone").remove()
2343 urlMaster=nodeMSTab[0].getJsonData().url;
2344 urlMasterPath=urlMaster.slice(0,urlMaster.search(
"vnc.html"));
2347 var HandledJQ=$(
"#Handled");
2349 height : iframeHandled.css(
'height'),
2350 width : iframeHandled.css(
'width'),
2354 Handled=$(
"#zoomSupport").children(
".handled")[0];
2356 $(
'header').append(
"<div id=explain-StartMS>First node is duplicated to have the master to interact.</div>");
2357 $(
'#explain-StartMS').css({
2359 backgroundColor :
"green",
2368 function initMSList() {
2371 str_autoconnect=
"?autoconnect=1&"
2372 MSPath=urlMasterPath+
"vnc_multi.html"+str_autoconnect+
"NbRFB="+(nodeMSTab.length-1)+
"&";
2373 for(i=1;i<nodeMSTab.length;i++) {
2374 var urlNode=nodeMSTab[i].getJsonData().url;
2375 urlNodeParam=urlNode.slice(urlNode.search(
"vnc.html")+
"vnc.html".length+str_autoconnect.length);
2376 NodeParams=urlNodeParam.split(
'&');
2377 for (P in NodeParams) {
2378 thisparam=NodeParams[P].slice(0,NodeParams[P].search(
"="));
2386 NodeParams[P]=NodeParams[P].replace(
"=",(i-1)+
"=");
2387 case(
"autoconnect"):
2392 MSPath=MSPath+NodeParams.join(
'&')+
'&';
2394 iframeHandled.attr(
"src",MSPath+
"&true_color=1");
2396 console.log(
"Master-Slave function will work only for VNC connections.");
2405 $(
'#buttonUnzoom').on({
2407 $(
'#explain-StartMS').remove();
2410 var Handled=$(
"#zoomSupport").children(
".handled")[0];
2414 menuMS.css(
"visibility",
"visible");
2424 MSMenuIconClassAttributesTab.push(
"expandZoomButtonIcon");
2425 MSMenuShareEvent.push(
false);
2428 MSMenuTitleTab.push(
"Apply MS on all tiles")
2429 MSMenuEventTab.push(
function(v,
id, optionNumber){
2430 me.resetNodesToZoom();
2431 var nodeMSTab = me.getNodesToZoom();
2433 for(O in nodesById) {
2434 nodeMSTab.push(nodesById[O]);
2436 menuMS.children(
"[class*=expandZoomButtonIcon]").click();
2438 for(O in nodesById) {
2439 me.removeNodeToZoom(O);
2441 me.setZoomSelection(
true);
2444 MSMenuIconClassAttributesTab.push(
"AllMSButtonIcon");
2445 MSMenuShareEvent.push(
false);
2448 MSMenuTitleTab.push(
"Master-Slave explain area")
2449 MSMenuEventTab.push(
function(v,
id, optionNumber){
2451 MSMenuIconClassAttributesTab.push(
"explain-MS");
2452 MSMenuShareEvent.push(
false);
2463 var ListZoomFunctions=[
"zoomNodes",
"zoom",
"MS",
"draw"];
2464 this.disableOtherZoom =
function (myzoomfunction) {
2465 for (var otherZoom in ListZoomFunctions) {
2466 var thisZoom=ListZoomFunctions[otherZoom];
2467 if ( thisZoom != myzoomfunction )
2468 var thiszoom=thisZoom[0].toUpperCase()+thisZoom.substring(1);
2469 if ($(
".close"+thisZoom+
"ButtonIcon")[0]) {
2470 $(
".close"+thisZoom+
"ButtonIcon").click();
2471 }
else if ($(
".close"+thiszoom+
"ButtonIcon")[0]) {
2472 $(
".close"+thiszoom+
"ButtonIcon").click();
2479 this.enableOtherZoom =
function (myzoomfunction) {
2492 var zoomMenuTitleTab =
new Array();
2493 var zoomMenuEventTab =
new Array();
2494 var zoomMenuIconClassAttributesTab =
new Array();
2495 var zoomMenuShareEvent =
new Array();
2498 zoomMenuTitleTab.push(
"Apply zoom button")
2499 zoomMenuEventTab.push(
function(v,
id, optionNumber) {
2502 var nodeZoomTab = me.getNodesToZoom();
2503 var ratio =spread.Y/spread.X;
2504 var initSpread = spread;
2506 if(nodeZoomTab.length>0) {
2507 $(
"#menu"+
id).css(
"visibility",
"hidden");
2510 me.magnifyingGlass(nodeZoomTab,ratio,initSpread);
2514 $(
'#buttonUnzoom').on({
2518 menuZoom.css(
"visibility",
"visible");
2524 zoomMenuIconClassAttributesTab.push(
"expandZoomButtonIcon");
2525 zoomMenuShareEvent.push(
false);
2527 zoomMenuTitleTab.push(
"Zoom explain area")
2528 zoomMenuEventTab.push(
function(v,
id, optionNumber) {
2531 zoomMenuIconClassAttributesTab.push(
"explain-zoom");
2532 zoomMenuShareEvent.push(
false);
2542 var zoomGlobalMenuTitleTab =
new Array();
2543 var zoomGlobalMenuEventTab =
new Array();
2544 var zoomGlobalMenuIconClassAttributesTab =
new Array();
2545 var zoomGlobalMenuShareEvent =
new Array();
2548 zoomGlobalMenuTitleTab.push(
"Zoom menu with selection")
2549 zoomGlobalMenuEventTab.push( (
function(){
2551 return function(v,id,optionNumber){
2560 me.disableOtherZoom(
"zoom")
2563 for (O in nodesByLoc)
2564 if (nodesByLoc[O].getNodeInViewportStatus()) {
2565 nodesByLoc[O].sub(
'').off();
2566 nodesByLoc[O].sub(
'hitbox').off(
"click").on(
"click", clickHBSelect);
2567 nodesByLoc[O].sub(
'hitbox').off(
"mouseenter");
2569 menuZoom.children(
'[class*=explain-zoom]')[0].innerText=
"Click on the left of the nodes to select them. Green nodes will be selected.";
2570 menuZoom.children(
'[class*=explain-zoom]').css({
2571 backgroundColor :
"green",
2577 menuZoom.css(
"visibility",
"visible");
2578 menuZoom.css(
"top", TagHeight+
"px");
2580 $(
'#'+
id+
'option'+optionNumber).removeClass(
'zoomButtonIcon').addClass(
"closezoomButtonIcon");
2585 me.enableOtherZoom(
"zoom")
2586 EnableDragAndDrop();
2588 me.setZoomSelection(
false);
2589 me.resetNodesToZoom();
2590 $(
'#buttonUnzoom').click();
2593 menuZoom.css(
"visibility",
"hidden");
2595 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closezoomButtonIcon").addClass(
"zoomButtonIcon");
2601 zoomGlobalMenuIconClassAttributesTab.push(
"zoomButtonIcon");
2602 zoomGlobalMenuShareEvent.push(
false);
2606 zoomGlobalMenuTitleTab.push(
"MasterSlave Menu")
2607 zoomGlobalMenuEventTab.push( (
function(){
2609 return function(v,id,optionNumber){
2611 me.setZoomSelection(
true);
2621 me.disableOtherZoom(
"MS")
2624 for (O in nodesByLoc)
2625 if (nodesByLoc[O].getNodeInViewportStatus()) {
2626 nodesByLoc[O].sub(
'').off();
2627 nodesByLoc[O].sub(
'hitbox').off(
"click").on(
"click", clickHBSelect);
2628 nodesByLoc[O].sub(
'hitbox').off(
"mouseenter");
2631 menuMS.children(
'[class*=explain-MS]')[0].innerText=
"Click on the left of the nodes to select them. Click on left \"validate button\" or right \"ALL selected\" button.";
2632 menuMS.children(
'[class*=explain-MS]').css({
2633 backgroundColor :
"green",
2639 menuMS.css(
"visibility",
"visible");
2640 menuMS.css(
"top", TagHeight+
"px");
2642 $(
'#'+
id+
'option'+optionNumber).removeClass(
"MSButtonIcon").addClass(
"closeMSButtonIcon");
2647 me.enableOtherZoom(
"MS")
2648 EnableDragAndDrop();
2650 me.setZoomSelection(
false);
2651 me.resetNodesToZoom();
2654 var Handled=$(
"#zoomSupport").children(
".handled")[0];
2658 $(
'#buttonUnzoom').click();
2661 menuMS.css(
"visibility",
"hidden");
2663 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeMSButtonIcon").addClass(
"MSButtonIcon");
2671 zoomGlobalMenuIconClassAttributesTab.push(
"MSButtonIcon");
2672 zoomGlobalMenuShareEvent.push(
false);
2675 zoomGlobalMenuTitleTab.push(
"Show fast zoom button")
2676 zoomGlobalMenuEventTab.push( (
function(){
2678 return function(v, id, optionNumber){
2680 me.disableOtherZoom(
"zoomNodes")
2683 $(
'.zoomNodeButtonIcon').show();
2684 $(
'#'+
id+
'option'+optionNumber).removeClass(
'zoomNodesButtonIcon').addClass(
'closeZoomNodesButtonIcon');
2687 me.enableOtherZoom(
"zoomNodes")
2688 EnableDragAndDrop();
2690 $(
'.zoomNodeButtonIcon').hide();
2691 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeZoomNodesButtonIcon").addClass(
"zoomNodesButtonIcon");
2696 zoomGlobalMenuIconClassAttributesTab.push(
"zoomNodesButtonIcon");
2697 zoomGlobalMenuShareEvent.push(
false);
2708 var stateGlobalMenuTitleTab =
new Array();
2709 var stateGlobalMenuEventTab =
new Array();
2710 var stateGlobalMenuIconClassAttributesTab =
new Array();
2711 var stateGlobalMenuShareEvent =
new Array();
2714 stateGlobalMenuTitleTab.push(
"Show OnOff button")
2715 stateGlobalMenuEventTab.push( (
function(){
2717 return function(v, id, optionNumber){
2719 for (O in nodesByLoc)
2720 if (nodesByLoc[O].getNodeInViewportStatus())
2721 nodesByLoc[O].getHtmlNode().children(
".onoff").css({display :
"inline"});
2722 $(
'#'+
id+
'option'+optionNumber).removeClass(
'OnOffButtonIcon').addClass(
'closeOnOffButtonIcon');
2724 for (O in nodesByLoc)
2725 if (nodesByLoc[O].getNodeInViewportStatus())
2726 nodesByLoc[O].getHtmlNode().children(
".onoff").css({display :
"none"});
2727 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeOnOffButtonIcon").addClass(
"OnOffButtonIcon");
2734 stateGlobalMenuIconClassAttributesTab.push(
"OnOffButtonIcon");
2735 stateGlobalMenuShareEvent.push(
true);
2738 stateGlobalMenuTitleTab.push(
"Show QR code link")
2739 stateGlobalMenuEventTab.push( (
function(){
2741 return function(v, id, optionNumber){
2743 $(
'.qrcode').show();
2744 $(
'#'+
id+
'option'+optionNumber).removeClass(
'QRcodeButtonIcon').addClass(
'closeQRcodeButtonIcon');
2746 $(
'.qrcode').hide();
2747 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeQRcodeButtonIcon").addClass(
"QRcodeButtonIcon");
2754 stateGlobalMenuIconClassAttributesTab.push(
"QRcodeButtonIcon");
2755 stateGlobalMenuShareEvent.push(
true);
2758 stateGlobalMenuTitleTab.push(
"Show node info")
2759 stateGlobalMenuEventTab.push( (
function(){
2761 return function(v, id, optionNumber){
2763 for (O in nodesByLoc)
2764 if (nodesByLoc[O].getNodeInViewportStatus())
2765 nodesByLoc[O].getHtmlNode().children(
".info").css({visibility :
"visible", display :
"inline" });
2766 $(
'#'+
id+
'option'+optionNumber).removeClass(
'showInfoButtonIcon').addClass(
'closeShowInfoButtonIcon');
2768 if(!! configBehaviour.alwaysShowInfo) {
2769 for (O in nodesByLoc)
2770 if (nodesByLoc[O].getNodeInViewportStatus())
2771 nodesByLoc[O].getHtmlNode().children(
".info").css({visibility :
"hidden"});
2773 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeShowInfoButtonIcon").addClass(
"showInfoButtonIcon");
2780 stateGlobalMenuIconClassAttributesTab.push(
"showInfoButtonIcon");
2781 stateGlobalMenuShareEvent.push(
true);
2792 var managementGlobalMenuTitleTab =
new Array();
2793 var managementGlobalMenuEventTab =
new Array();
2794 var managementGlobalMenuIconClassAttributesTab =
new Array();
2795 var managementGlobalMenuShareEvent =
new Array();
2800 emit_ModifDraws=
function(action,nodeId) {
2801 cdata={
"room":my_session,
"action":action,
"nodeId":nodeId};
2802 socket.emit(
"modif_draws", cdata, callback=
function(sdata){
2803 console.log(
"socket send modif_draws ", cdata);
2807 socket.on(
'receive_SuppressDraw',
function(sdata){
2808 var thisblob=DrawBlobs.get(sdata.nodeId.toString());
2809 var newImg=thisblob.image;
2810 var canvasName=thisblob.canvasName;
2811 for (ind in thisblob.listNodeImg) {
2812 Id=thisblob.listNodeImg[ind];
2813 DrawNodeId=canvasName+
"_img_"+Id;
2814 $(
"#"+DrawNodeId).remove();
2816 DrawBlobs.delete(thisblob.nodeId.toString());
2817 $(
'#'+newImg.id).remove();
2818 $(
'#draws'+thisblob.nodeId).remove();
2821 socket.on(
'receive_HideDraw',
function(sdata){
2822 var thisblob=DrawBlobs.get(sdata.nodeId.toString());
2823 var canvasName=thisblob.canvasName;
2824 for (ind in thisblob.listNodeImg) {
2825 Id=thisblob.listNodeImg[ind];
2826 DrawNodeId=canvasName+
"_img_"+Id;
2827 $(
"#"+DrawNodeId).hide();
2829 $(
'input[name=drawOtherNodes'+thisblob.nodeId+
']').val(
'yes').attr(
"checked",
true);
2832 socket.on(
'receive_ShowDraw',
function(sdata){
2833 var thisblob=DrawBlobs.get(sdata.nodeId.toString());
2834 var canvasName=thisblob.canvasName;
2835 for (ind in thisblob.listNodeImg) {
2836 Id=thisblob.listNodeImg[ind];
2837 DrawNodeId=canvasName+
"_img_"+Id;
2838 $(
"#"+DrawNodeId).show();
2840 $(
'input[name=drawOtherNodes'+thisblob.nodeId+
']').val(
'no').attr(
"checked",
false);
2843 managementGlobalMenuTitleTab.push(
"Draws management")
2844 managementGlobalMenuEventTab.push( (
function(){
2846 return function(v, id, optionNumber){
2848 $(
'header').append(
"<div id=DrawsMenu class=option-draws></div>");
2849 $(
'#DrawsMenu').css({
2850 backgroundColor :
"SkyBlue",
2858 DrawBlobs.forEach(
function(thisblob) {
2859 $(
'#DrawsMenu').append(
"<div id='draws"+thisblob.nodeId+
"'> </div>");
2860 $(
'#draws'+thisblob.nodeId).append(
"<input type='checkbox' id='drawNode"+thisblob.nodeId+
"' name='drawNode"+thisblob.nodeId+
"' value='no'> supress Node "+thisblob.nodeId+
" | </input>");
2861 $(
'#draws'+thisblob.nodeId).append(
"<input type='checkbox' id='drawOtherNodes"+thisblob.nodeId+
"' name='drawOtherNodes"+thisblob.nodeId+
"' value='no'> Hide all clone "+ thisblob.listNodeImg.length+
"</br></input>");
2863 $(
'#drawNode'+thisblob.nodeId).off(
"change").on({
2864 change :
function() {
2866 emit_ModifDraws(
"SuppressDraw",thisblob.nodeId);
2867 window.URL.revokeObjectURL(thisblob.url);
2871 $(
'#drawOtherNodes'+thisblob.nodeId).off(
"change").on({
2872 change :
function() {
2873 if (!! $(
'input[name=drawOtherNodes'+thisblob.nodeId+
']').attr(
"checked")) {
2875 emit_ModifDraws(
"HideDraw",thisblob.nodeId);
2878 emit_ModifDraws(
"ShowDraw",thisblob.nodeId);
2883 $(
'#'+
id+
'option'+optionNumber).removeClass(
'DrawsButtonIcon').addClass(
'closeDrawsButtonIcon');
2886 $(
'header').children(
"#DrawsMenu").remove();
2887 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeDrawsButtonIcon").addClass(
"DrawsButtonIcon");
2893 managementGlobalMenuIconClassAttributesTab.push(
"DrawsButtonIcon");
2894 managementGlobalMenuShareEvent.push(
true);
2897 managementGlobalMenuTitleTab.push(
"Save working session")
2898 managementGlobalMenuEventTab.push(
function(v,
id,optionNumber){
2901 for(O in nodesByLoc) {
2902 var
id=nodesByLoc[O].getId();
2903 if (nodesByLoc[O].getOnOffStatus()) {
2905 nodesByLoc[O].getJsonData().IdLocation = nodesByLoc[O].getIdLocation();
2908 nodesByLoc[O].getJsonData().userNotes = nodesByLoc[O].getComment();
2910 nodesByLoc[O].getJsonData().tags = nodesByLoc[O].getNodeTagList();
2915 $(
'#notifications').html(
'<div id=saveTiles height="10%" width="50%"></div>');
2916 $(
'#saveTiles').append(
'<form style="font-size: 45px"> Save all tiles or just visible ones (default) ? '
2917 +
'<input type="checkbox" id="allTiles" value="no" ></input> '
2918 +
'<button id="submitTiles" name="submitTiles" class="btn btn-info" style="font-size: 40px"> Submit</button> '
2920 var saveAllTiles=
false;
2921 $(
'#allTiles').off(
"change").on({
2922 change :
function() {
2923 saveAllTiles=$(
'input[name=allTiles]').attr(
"checked");
2926 $(
'#submitTiles').off(
"click").on(
"click",
function() {
2927 $(
'#saveTiles').remove();
2930 var temp =
"{\"nodes\": [XXX] }";
2933 for(O in nodesByLoc) {
2935 if (saveAllTiles || nodesByLoc[O].getOnOffStatus()) {
2936 id=nodesByLoc[O].getId();
2939 var temp3 =
"{{***}}";
2941 for(W in nodesByLoc[O].getJsonData()) {
2943 var ListTags=
new Array();
2944 nodesByLoc[O].getNodeTagList().forEach(
function(currentValue) {
2945 if (currentValue in globalFloatingTags) {
2946 var ft=nodesByLoc[O].getFloatingTag()
2947 ListTags.push(
"'{"+currentValue+
","+ft[currentValue][
"m"]+
","+ft[currentValue][
"val"]+
","+ft[currentValue][
"M"] +
"}'") }
2949 ListTags.push(
"'"+currentValue +
"'") }
2951 var mytext =
"\""+W+
"\""+
" : "+
"["+ListTags.toString().replace(/\
'/g,'\
"')+"], {***}
"
2952 } else if ( W == "comment
") {
2953 // Don't save old comment because user may have modified it in postit.
2954 var mytext = "{***}
";
2955 } else if ( W == "userNotes
") {
2956 comment=nodesByLoc[O].getJsonData()["userNotes
"].toString().replace(/\"/g,"'")
2957 var mytext = "\"comment\""+" : "+"\""+comment+"\""+", {***}"
2958 // } else if ( W == "IdLocation") {
2959 // var mytext = "\""+W+"\""+" : "+"\""+nodesByLoc[0].getIdLocation().toString()+"\""+",\n {***}";
2961 var mytext = "\""+W+"\""+" : "+"\""+nodesByLoc[O].getJsonData()[W].toString().replace(/\"/g,"'").replace(/\n/g,"")+"\
""+
", {***}";
2963 temp3=temp3.replace(
"{***}",mytext);
2965 temp3=temp3.replace(
", {***}",
"");
2966 temp=temp.replace(
"XXX",temp3+
",XXX");
2970 temp=temp.replace(
",XXX",
"");
2974 var sessionDate =
new Date();
2975 var strDate=sessionDate.toLocaleDateString({day:
"2-digit", month:
"2-digit"}).replace(/\
2978 var fileName = my_session +
"_" +
"tiles_" + strDate +
".json";
2981 $(
'#notifications').html(
'<div id=saveValidate height="10%" width="50%"></div>');
2984 $(
'#saveValidate').append(
'<form style="font-size: 45px"> New suffix for save '+my_session+
' '
2985 +
'<input type=text id="newSuffix" value="'+strDate+
'" style="width:20%"></input> '
2986 +
'Change description : <input type=text id="newDescr" value="'+my_description+
'" style="width:50%"></input> '
2987 +
'<button id="submitSave" name="submitSave" class="btn btn-info" style="font-size: 40px"> Submit</button> '
2988 +
'<button id="submitCancel" name="submitCancel" class="btn btn-info" style="font-size: 40px"> Cancel</button></form>');
2989 $(
'#submitSave').off(
"click").on(
"click",
function() {
2991 download([tempFile], fileName,
"text/plain;charset=utf-8")
2993 new_suffix=$('
#newSuffix').val();
2994 new_description=$(
'#newDescr').val();
2995 new_room=my_session+
'_'+new_suffix;
2996 cdata ={
"room":my_session,
"NewSuffix": new_suffix,
"NewDescription": new_description,
"Session": temp }
2997 console.log(
"Save session : "+new_room);
2998 socket.emit(
"save_Session", cdata);
2999 $(
'#saveValidate').remove();
3001 $(
'#notifications').html(
'<div id=gotoNewRoom height="10%" width="50%" style="font-size:75"></div>');
3002 $(
'#gotoNewRoom').append(
'Goto new room ?<br>'
3003 +
'<input type="text" id="gNRnew_room" name="new room" value="'+ new_room +
'" style="width:40%"></input> '
3004 +
'<button id="ChangeRoomYes" name="ChangeRoomYes" class="btn btn-info" style="font-size: 40px">Yes</button> '
3005 +
'<button id="ChangeRoomNo" name="ChangeRoomNo" class="btn btn-info" style="font-size: 40px">No</button>');
3007 $(
'#ChangeRoomYes').off(
"click").on(
"click",
function() {
3008 new_room=$(
'#gNRnew_room').val();
3009 cdata ={
"room":my_session,
"NewRoom": new_room }
3010 $(
'#gGnewroom').val(new_room);
3011 socket.emit(
"deploy_Session", cdata);
3014 $(
'#ChangeRoomNo').off(
"click").on(
"click",
function() {
3015 $(
'#gotoNewRoom').remove();
3018 $(
'#submitCancel').off(
"click").on(
"click",
function() {
3019 $(
'#saveValidate').remove();
3023 managementGlobalMenuIconClassAttributesTab.push(
"saveButtonIcon");
3024 managementGlobalMenuShareEvent.push(
false);
3029 managementGlobalMenuTitleTab.push(
"Option menu")
3030 managementGlobalMenuEventTab.push(
function(v,
id, optionNumber){
3032 $(
'header').append(
"<div id=options class='dropbtn'></div>");
3036 left: parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
3039 width :window.innerWidth - parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
3045 $(
'#options').append(
"<div id=options-zone></div>");
3046 $(
'#options-zone').append(
"<div id=options-menus class=option-group></div>");
3051 $(
'#options-menus').append(
'<div id=dropdownglobal class="drop-left-menu" ></div>');
3052 $(
'#dropdownglobal').css({
3053 position:
'absolute',
3061 $(
'#options-menus').append(
"<div id=options-global-menu-label class='label'>Share global menu</div>");
3062 var thisMenuShareEvent=me.menu.getMenuShareEvent();
3063 var thisIconTab=me.menu.getMenuIconClassAttributesTab();
3064 var LocalMenus=Array();
3065 var GlobalMenuLabelState=
false;
3066 var SubmenuLabelState=
false;
3067 var SubmenusLabelState={};
3069 for (var theOption in thisIconTab) {
3070 $(
'#options-global-menu-label')
3071 .append(
"<div id='shareDivMenu_"+thisIconTab[theOption]+
"' style='font-size:100'></div>");
3072 $(
"#shareDivMenu_"+thisIconTab[theOption]).hide()
3073 .append(
"</br><input type='checkbox' id='shareMenu_"+thisIconTab[theOption]+
"' name='shareMenu_"+thisIconTab[theOption]+
"' value='yes' >"+
3074 thisIconTab[theOption].replace(
"GlobalMenu",
"Menu").replace(
"ButtonIcon",
""));
3075 $(
'input[name=shareMenu_'+thisIconTab[theOption]+
']').attr(
"checked",thisMenuShareEvent[theOption]);
3076 if (thisIconTab[theOption].search(
"GlobalMenu") > -1)
3077 LocalMenus.push(thisIconTab[theOption])
3080 $(
'#dropdownglobal').on({
3081 click :
function(e) {
3082 if (GlobalMenuLabelState) {
3083 GlobalMenuLabelState=
false;
3084 $(
'#dropdownglobal').removeClass(
"drop-down-menu").addClass(
"drop-left-menu");
3085 for (var theOption in thisIconTab) {
3086 $(
"#shareDivMenu_"+thisIconTab[theOption]).hide();
3089 GlobalMenuLabelState=
true;
3090 $(
'#dropdownglobal').removeClass(
"drop-left-menu").addClass(
"drop-down-menu");
3091 for (var theOption in thisIconTab) {
3092 $(
"#shareDivMenu_"+thisIconTab[theOption]).show();
3098 $(
'#options-menus').append(
'<br><br><div id=dropdownsubm class="drop-left-menu"></div>');
3099 $(
'#dropdownsubm').css({
3100 position:
'relative',
3107 $(
'#options-menus').append(
"<div id=options-submenus-label class='label' style='font-size:95'>Share sub-menus</div>");
3108 for (var locMenu in LocalMenus) {
3109 var menuname=LocalMenus[locMenu].replace(
"GlobalMenuButtonIcon",
"Global");
3110 var thismenu=subMenusGlobal.filter(menu=>menu.getId()==menuname)[0];
3111 var thismenuShareEvent=thismenu.getMenuShareEvent();
3112 var thisiconTab=thismenu.getMenuIconClassAttributesTab();
3114 $(
'#options-submenus-label').append(
'<br><div id="dropdownsubm_'+menuname+
'" class="drop-left-menu"></div>');
3115 $(
'#dropdownsubm_'+menuname).css({
3116 position:
'relative',
3122 transform:
"scale(0.75)"
3125 $(
'#options-submenus-label').append(
"<div id='shareDivSubmenu_"+menuname+
"' style='font-size:85'>"+menuname+
"</div>");
3126 $(
"#shareDivSubmenu_"+menuname).hide();
3127 SubmenusLabelState[menuname]=
false;
3129 for (var theOption in thisiconTab) {
3130 $(
"#shareDivSubmenu_"+menuname)
3131 .append(
"<div id=options-submenu-"+menuname+
"-"+thisiconTab[theOption]+
" ></div>");
3132 $(
"#options-submenu-"+menuname+
"-"+thisiconTab[theOption]).hide()
3133 .append(
"<br><input type='checkbox' id='shareMenu_"+thisiconTab[theOption]+
"' name='shareMenu_"+thisiconTab[theOption]+
"' value='yes'>"+
3134 thisiconTab[theOption].replace(
"ButtonIcon",
""));
3135 $(
'input[name=shareMenu_'+thisiconTab[theOption]+
']').attr(
"checked",thismenuShareEvent[theOption]);
3138 $(
'#dropdownsubm_'+menuname).on({
3139 click :
function(e) {
3140 var menuname=this.
id.replace(
"dropdownsubm_",
"");
3141 var thismenu=subMenusGlobal.filter(menu=>menu.getId()==menuname)[0];
3142 var thisiconTab=thismenu.getMenuIconClassAttributesTab();
3143 if (SubmenusLabelState[menuname]) {
3144 SubmenusLabelState[menuname]=
false;
3145 $(
'#dropdownsubm_'+menuname).removeClass(
"drop-down-menu").addClass(
"drop-left-menu");
3146 for (var theOption in thisiconTab) {
3147 $(
"#options-submenu-"+menuname+
"-"+thisiconTab[theOption]).hide()
3150 SubmenusLabelState[menuname]=
true;
3151 $(
'#dropdownsubm_'+menuname).removeClass(
"drop-left-menu").addClass(
"drop-down-menu");
3152 for (var theOption in thisiconTab) {
3153 $(
"#options-submenu-"+menuname+
"-"+thisiconTab[theOption]).show();
3161 $(
'#dropdownsubm').on({
3162 click :
function(e) {
3163 if (SubmenuLabelState) {
3164 SubmenuLabelState=
false;
3165 $(
'#dropdownsubm').removeClass(
"drop-down-menu").addClass(
"drop-left-menu");
3166 for (var locMenu in LocalMenus) {
3167 var menuname=LocalMenus[locMenu].replace(
"GlobalMenuButtonIcon",
"Global");
3168 $(
'#dropdownsubm_'+menuname).hide();
3169 $(
"#shareDivSubmenu_"+menuname).hide();
3172 SubmenuLabelState=
true;
3173 $(
'#dropdownsubm').removeClass(
"drop-left-menu").addClass(
"drop-down-menu");
3174 for (var locMenu in LocalMenus) {
3175 var menuname=LocalMenus[locMenu].replace(
"GlobalMenuButtonIcon",
"Global");
3176 $(
'#dropdownsubm_'+menuname).show();
3177 $(
"#shareDivSubmenu_"+menuname).show();
3183 setColorTheme(configColors.colorTheme);
3185 $(
'#options-zone').append(
"<div id=options-look class=option-group></div>");
3188 $(
'#options-look').append(
"<div id=options-color-theme-label class=label>Color theme</div>");
3189 $(
'#options-look').append(
"<form id=options-color-theme-form>");
3190 $(
'#options-look').append(
"<input type='radio' name='color-theme-radio' value='dark'/>Dark<br />");
3191 $(
'#options-look').append(
"<input type='radio' name='color-theme-radio' value='light'/>Light<br />");
3192 $(
'#options-look').append(
"</form><br>");
3193 $(
'input[name=color-theme-radio][value=' + configColors.colorTheme +
']').attr(
"checked",
true);
3201 $(
'#options-look').append(
"<div id=options-opacity-label class=label>Opacity</div>");
3202 $(
'#options-look').append(
"<input id=opacitySlider type='range' name=opacitySlider min=0 max=100 value= " +
3203 configBehaviour.opacity*100 +
" oninput='opacitySliderOutputId.value=opacitySlider.value.toString()+ \"%\"'>");
3204 $(
'#options-look').append(
"<output name=opacitySliderOutput id=opacitySliderOutputId for=opacitySlider "+
3205 "style='font-size: 80px; padding: 20px; padding-top: 5px; padding-bottom: 5px;'>"+
3206 configBehaviour.opacity*100 +
"%</output><br /><br />");
3207 $(
'#opacitySlider').change(
function () {
3208 var val = ($(
this).val() - $(
this).attr(
'min')) / ($(
this).attr(
'max') - $(
this).attr(
'min'));
3210 $(
this).css(
'background-image',
3211 '-webkit-gradient(linear, left top, right top, '
3212 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
3213 +
'color-stop(' + val +
', rgb(0, 255, 0))'
3220 $(
'#options-look').append(
"<div id=options-primaryZoomSlider-label class=label>Global Zoom Slider</div>");
3221 $(
'#options-look').append(
"<input type='checkbox' name=enable-primaryZoom value="+ configBehaviour.primaryZoomSlider +
">Enable primary Zoom Slider<br />");
3222 if (parseBool(configBehaviour.primaryZoomSlider))
3223 $(
'input[name=enable-primaryZoom]').attr(
"checked",configBehaviour.primaryZoomSlider);
3226 $(
'#options-look').append(
"<div id=options-globalVerticalSlider-label class=label>Global Vertical Slider</div>");
3228 $(
'#options-look').append(
"<input type='checkbox' name=enable-globalVertical value="+gVS+
">Enable browser vertical slider<br />");
3230 $(
'input[name=enable-globalVertical]').attr(
"checked",gVS);
3233 $(
'#options-zone').append(
"<div id=options-spread class=option-group></div>");
3234 $(
'#options-spread').append(
"<div id=options-spread-label class=label>Tile size</div>");
3235 $(
'#options-spread').append(
"<input type='checkbox' name=spread-keepratio value="+ configBehaviour.defaultKeepRatio +
">Keep ratio<br />");
3236 if (parseBool(configBehaviour.defaultKeepRatio))
3237 $(
'input[name=spread-keepratio]').attr(
"checked",configBehaviour.defaultKeepRatio);
3239 $(
'#options-spread').append(
"X: <input id=spreadX name=spreadX type='number' value=" +spread.X +
">px ");
3240 $(
'#options-spread').append(
"Y: <input id=spreadY name=spreadY type='number' value=" +spread.Y +
">px <br />");
3241 $(
'#options-spread').append(
"Number of columns:</br><input id=colNumber name=colNumber type='number' value=" +numOfColumns+
"><br />");
3242 $(
'#options-spread').append(
"Space Between </br>Columns:<input id=spaceBetweenColumns name=spaceBetweenColumns type='number' value=" +gapBetweenColumns+
"><br />");
3243 $(
'#options-spread').append(
"Lines:<input id=spaceBetweenLines name=spaceBetweenLines type='number' value=" +gapBetweenLines+
"><br />");
3245 var clickKR =
function(){
3246 if ($(
'input[name=spread-keepratio]').is(
":checked")) {
3248 $(
'input[name=spreadX]').off(
"change").on({
3249 change :
function(){
3250 $(
'input[name=spreadX]').val($(
'input[name=spreadX]').val().replace(/[^0-9.]/g,
''))
3252 var ratioX = $(
'input[name=spreadX]').val()/spread.X;
3254 $(
'input[name=spreadY]').val(spread.Y*ratioX);
3257 $(
'input[name=spreadY]').off(
"change").on({
3258 change :
function(){
3259 $(
'input[name=spreadY]').val($(
'input[name=spreadY]').val().replace(/[^0-9.]/g,
''))
3261 var ratioY = $(
'input[name=spreadY]').val()/spread.Y;
3263 $(
'input[name=spreadX]').val(spread.X*ratioY);
3271 $(
'input[name=spread-keepratio]').off(
"click").on({
3274 if(configBehaviour.defaultKeepRatio) {
3275 $(
'input[name=spread-keepratio]').click();
3279 $(
'#options-zone').append(
"<div id=options-info class=option-group></div>");
3280 $(
'#options-info').append(
"<div id=options-showinfo-label class=label>Informations</div>");
3281 $(
'#options-info').append(
"<input type='checkbox' id='showinfo-cb' name='showinfo-cb' value="+configBehaviour.alwaysShowInfo+
">Always show</input>");
3282 if (parseBool( configBehaviour.alwaysShowInfo))
3283 $(
'input[name=showinfo-cb]').attr(
"checked", configBehaviour.alwaysShowInfo);
3285 $(
'#options-info').append(
"<div id=options-info-font-label class=label>Font</div>");
3286 $(
'#options-info').append(
"<select id=options-info-font-select></select>");
3287 for (var it = 0;it<configBehaviour.infoFonts.length;it++) {
3288 $(
'#options-info-font-select').append(
"<option value='"+it+
"'>"+configBehaviour.infoFonts[it].split(
",")[0]+
"</option>");
3289 if(it==configBehaviour.defaultFontIndex) {
3290 $(
'#options-info-font-select').val(it);
3293 $(
'#options-info').append(
"<div id=options-info-size-label class=label>Size</div>");
3294 $(
'#options-info').append(
"<input id=infoSize name=infoSize type='number' value="+ parseInt($(
'.info').css(
"font-size")) +
"><h1> less than "+configBehaviour.maxInfoFontSize+
"</h1>");
3297 $(
'#options-zone').append(
"<div id=options-dragdrop class=option-group></div>");
3298 $(
'#options-dragdrop').append(
"<div id=options-dragdrop-label class=label>Drag & drop</div>");
3299 $(
'#options-dragdrop').append(
"<input type='checkbox' id='show-only-border-cb' name='show-only-border-cb' value="+configBehaviour.moveOnlyABorder+
">Show only the border</br></input>");
3300 if (parseBool( configBehaviour.moveOnlyABorder))
3301 $(
'input[name=show-only-border-cb]').attr(
"checked", configBehaviour.moveOnlyABorder);
3302 $(
'#options-dragdrop').append(
"<input type='checkbox' id='move-on-menu-item-cb' name='move-on-menu-item-cb' value="+configBehaviour.moveOnMenuOption+
">Enable in menu items</br></input>");
3303 if (parseBool( configBehaviour.moveOnMenuOption))
3304 $(
'input[name=move-on-menu-item-cb]').attr(
"checked", configBehaviour.moveOnMenuOption);
3305 $(
'#options-dragdrop').append(
"<input type='checkbox' id='move-on-grid-cb' name='move-on-grid-cb' value="+configBehaviour.moveOnGrid+
">Move on a grid</br></br></input>");
3306 if (parseBool( configBehaviour.moveOnGrid))
3307 $(
'input[name=move-on-grid-cb]').attr(
"checked", configBehaviour.moveOnGrid);
3308 $(
'#options-dragdrop').append(
"<input type='checkbox' id='showAnimationsLineColSwap' name='showAnimationsLineColSwap' value="+configBehaviour.showAnimationsLineColSwap+
">Animate moves</br></input>");
3309 if (parseBool( configBehaviour.showAnimationsLineColSwap))
3310 $(
'input[name=showAnimationsLineColSwap]').attr(
"checked", configBehaviour.showAnimationsLineColSwap);
3311 $(
'#options-dragdrop').append(
"<br>Speed of animations:</br><input id=AnimationSpeed name=AnimationSpeed type='number' value=" +configBehaviour.animationSpeed+
"></br>");
3314 $(
'#options-zone').append(
"<div id=options-zoom class=option-group></div>");
3315 $(
'#options-zoom').append(
"<div id=options-sharedZoomNodes-label class=label>Shared zoom nodes</div>");
3316 $(
'#options-zoom').append(
"<input type='checkbox' name=enable-sharedzoomnodes value="+ configBehaviour.sharedZoomNodes +
">Enable shared zoom nodes<br /></br>");
3317 if (parseBool(configBehaviour.sharedZoomNodes))
3318 $(
'input[name=enable-sharedzoomnodes]').attr(
"checked",configBehaviour.sharedZoomNodes);
3320 $(
'#options-zoom').append(
"<input type='checkbox' name=enable-sharedSliderzoom value="+ configBehaviour.sharedSliderZoom +
">Enable shared slider zoom<br /></br>");
3321 if (parseBool(configBehaviour.sharedSliderZoom))
3322 $(
'input[name=enable-sharedSliderzoom]').attr(
"checked",configBehaviour.sharedSliderZoom);
3325 $(
'#options-zoom').append(
"<div id=options-masterslave-label class=label>Parallel interaction</div>");
3326 $(
'#options-zoom').append(
"<br>Number of tiles showed:</br><input id=allMSShowMax name=allMSShowMax type='number' value=" +configBehaviour.allMSShowMax+
"></br>");
3327 $(
'#options-zoom').append(
"<br>Only MASTER in MS mode:</br><input id=onlyMasterMS name=onlyMasterMS type='checkbox' value=" +configBehaviour.onlyMasterMS+
"></br>");
3328 if (parseBool(configBehaviour.onlyMasterMS))
3329 $(
'input[name=onlyMasterMS]').attr(
"checked",configBehaviour.onlyMasterMS);
3331 $(
'#options-zone').append(
"<div id=options-touch class=option-group></div>");
3333 $(
'#options-touch').append(
"<div id=options-touch-label class=label>Touchable device</div>");
3336 $(
'#options-touch').append(
"<br>Speed of touch:</br><input id=touchSpeed name=touchSpeed type='number' value=" +configBehaviour.touchSpeed+
"></br>");
3337 $(
'#options-touch').append(
"<input type='checkbox' id='touchon-window' name='touchon-window' value="+configBehaviour.touchonWindow+
">Touch on window gesture</input></br>");
3338 if (parseBool( configBehaviour.touchonWindow))
3339 $(
'input[name=touchon-window]').attr(
"checked", configBehaviour.touchonWindow);
3341 $(
'#options-touch').append(
"<input type='checkbox' id='smooth-rotation' name='smooth-rotation' value="+configBehaviour.smoothRotation+
">Smooth rotation</input>");
3342 if (parseBool( configBehaviour.smoothRotation))
3343 $(
'input[name=smooth-rotation]').attr(
"checked", configBehaviour.smoothRotation);
3345 $(
'#options-touch').append(
"<br>Speed of rotation:</br><input id=RotInc name=RotInc type='number' step='0.1' value=" +configBehaviour.RotationSpeed+
"></br>");
3348 $(
'#options').append(
"<div id=buttonApply title='Apply for this browser'></div>");
3351 $(
'#options').append(
"<div id=buttonCancel title='Cancel changes'></div>");
3354 $(
'#options').append(
"<div id=buttonSave title='Apply and save options to a file'></div>");
3357 $(
'#options').append(
"<div id=buttonShare title='Apply and share to other clients in session'</div>");
3359 $(
'#'+
id+
'option'+optionNumber).attr(
'class', $(
'#'+
id+
'option'+optionNumber).attr(
'class').replace(
'optionsButtonIcon',
'closeOptionsButtonIcon'));
3362 ApplyParameters =
function() {
3363 var tempColors =
"'colors': {***}";
3365 var tempBehaviour =
"'behaviour': {***}";
3369 if(configColors.colorTheme != $(
'input[name=color-theme-radio]').filter(
':checked').val()) {
3370 configColors.colorTheme = $(
'input[name=color-theme-radio]').filter(
':checked').val();
3371 setColorTheme(configColors.colorTheme);
3373 tempColors=tempColors.replace(
"***",
"'colorTheme':'"+configColors.colorTheme+
"'"+
", ***");
3379 if(configBehaviour.opacity*100 != $(
'#opacitySlider').val()) {
3380 configBehaviour.opacity = Math.max($(
'#opacitySlider').val()/100, 0.1);
3381 for (O in nodesById) {
3382 nodesById[O].setNodeOpacity(configBehaviour.opacity);
3385 tempBehaviour=tempBehaviour.replace(
"***",
"'opacity':"+configBehaviour.opacity+
", ***");
3387 configBehaviour.primaryZoomSlider = $(
'input[name=enable-primaryZoom]').is(
":checked");
3388 if (parseBool( configBehaviour.primaryZoomSlider )) {
3389 $(
'#primarySliderLabel').show();
3390 $(
'#primarySlider').show();
3391 $(
'#primarySlider').click();
3393 $(
'#primarySliderLabel').hide();
3394 $(
'#primarySlider').hide();
3395 $(
'#primaryparent').css(
"transform",
"")
3396 $(
'#primaryparent').css(
"transform-origin",
"")
3399 var gVS = $(
'input[name=enable-globalVertical]').is(
":checked");
3401 document.body.setAttribute(
'style',
'overflow:hidden auto;');
3403 document.body.setAttribute(
'style',
'overflow:hidden;');
3405 var hasSpreadChanged =
false;
3406 if(spread.X != $(
'input[name=spreadX]').val()) {
3407 if ( $(
'input[name=spreadX]').val() ==
"")
3408 $(
'input[name=spreadX]').val(spread.X)
3410 hasSpreadChanged =
true;
3412 if(spread.Y != $(
'input[name=spreadY]').val()) {
3413 if ( $(
'input[name=spreadY]').val() ==
"")
3414 $(
'input[name=spreadY]').val(spread.Y)
3416 hasSpreadChanged =
true;
3419 if(hasSpreadChanged) {
3420 $(
'input[name=spreadX]').val($(
'input[name=spreadX]').val().replace(/[^0-9.]/g,
''))
3421 $(
'input[name=spreadY]').val($(
'input[name=spreadY]').val().replace(/[^0-9.]/g,
''))
3423 X : parseInt($(
'input[name=spreadX]').val()),
3424 Y : parseInt($(
'input[name=spreadY]').val())
3427 me.updateSpread(newSpread);
3429 temp3=
"'spread': { 'X':"+newSpread.X+
", 'Y':"+newSpread.Y+
"}";
3430 tempBehaviour=tempBehaviour.replace(
"***",temp3+
", ***");
3434 numOfColumns = parseInt($(
'input[name=colNumber]').val());
3435 tempBehaviour=tempBehaviour.replace(
"***",
"'maxNumOfColumns': "+numOfColumns+
", ***");
3437 gapBetweenColumns = parseInt($(
'input[name=spaceBetweenColumns]').val());
3438 tempBehaviour=tempBehaviour.replace(
"***",
"'spaceBetweenColumns': "+gapBetweenColumns+
", ***");
3440 gapBetweenLines = parseInt($(
'input[name=spaceBetweenLines]').val());
3441 tempBehaviour=tempBehaviour.replace(
"***",
"'spaceBetweenLines': "+gapBetweenLines+
", ***");
3443 maxNumOfColumns=numOfColumns;
3444 mesh.globalLocationProvider();
3446 configBehaviour.alwaysShowInfo = $(
'input[name=showinfo-cb]').is(
":checked");
3447 tempBehaviour=tempBehaviour.replace(
"***",
"'alwaysShowInfo': '"+configBehaviour.alwaysShowInfo+
"', ***");
3449 if(parseInt($(
'.info').css(
"font-size"))!=$(
'#infoSize').val()) {
3450 $(
'.info').css(
"font-size", Math.min($(
'#infoSize').val(), configBehaviour.maxInfoFontSize) +
"px");
3451 configBehaviour.defaultInfoFontSize = $(
'.info').css(
"font-size");
3453 tempBehaviour=tempBehaviour.replace(
"***",
"'defaultInfoFontSize': '"+configBehaviour.defaultInfoFontSize+
"', ***");
3455 configBehaviour.defaultFontIndex = $(
'#options-info-font-select').val();
3456 $(
'.info').css(
"font-family", configBehaviour.infoFonts[configBehaviour.defaultFontIndex]);
3458 tempBehaviour=tempBehaviour.replace(
"***",
"'defaultFontIndex': "+configBehaviour.defaultFontIndex+
", ***");
3460 configBehaviour.moveOnlyABorder = $(
'input[name=show-only-border-cb]').is(
":checked");
3461 tempBehaviour=tempBehaviour.replace(
"***",
"'moveOnlyABorder': '"+configBehaviour.moveOnlyABorder+
"', ***");
3462 configBehaviour.moveOnMenuOption = $(
'input[name=move-on-menu-item-cb]').is(
":checked");
3463 tempBehaviour=tempBehaviour.replace(
"***",
"'moveOnMenuOption': '"+configBehaviour.moveOnMenuOption+
"', ***");
3464 configBehaviour.moveOnGrid = $(
'input[name=move-on-grid-cb]').is(
":checked");
3465 tempBehaviour=tempBehaviour.replace(
"***",
"'moveOnGrid': '"+configBehaviour.moveOnGrid+
"', ***");
3466 configBehaviour.showAnimationsLineColSwap = $(
'input[name=showAnimationsLineColSwap]').is(
":checked");
3467 tempBehaviour=tempBehaviour.replace(
"***",
"'showAnimationsLineColSwap': '"+configBehaviour.showAnimationsLineColSwap+
"', ***");
3469 configBehaviour.animationSpeed = $(
'#AnimationSpeed').val();
3470 tempBehaviour=tempBehaviour.replace(
"***",
"'animationSpeed': "+configBehaviour.animationSpeed+
", ***");
3472 configBehaviour.sharedZoomNodes = $(
'input[name=enable-sharedzoomnodes]').is(
":checked");
3473 tempBehaviour=tempBehaviour.replace(
"***",
"'sharedZoomNodes': '"+configBehaviour.sharedZoomNodes+
"', ***");
3475 configBehaviour.sharedSliderZoom = $(
'input[name=enable-sharedSliderzoom]').is(
":checked");
3476 tempBehaviour=tempBehaviour.replace(
"***",
"'sharedSliderZoom': '"+configBehaviour.sharedSliderZoom+
"', ***");
3478 configBehaviour.allMSShowMax = $(
'#allMSShowMax').val();
3479 tempBehaviour=tempBehaviour.replace(
"***",
"'allMSShowMax': "+configBehaviour.allMSShowMax+
", ***");
3481 configBehaviour.onlyMasterMS = $(
'#onlyMasterMS').val();
3482 tempBehaviour=tempBehaviour.replace(
"***",
"'onlyMasterMS': "+configBehaviour.onlyMasterMS+
", ***");
3485 configBehaviour.touchSpeed = $(
'#touchSpeed').val();
3486 tempBehaviour=tempBehaviour.replace(
"***",
"'touchSpeed': "+configBehaviour.touchSpeed+
", ***");
3488 configBehaviour.touchonWindow = $(
'#touchon-window').val();
3489 if (parseBool(configBehaviour.touchonWindow)) {
3490 document.body.setAttribute(
'style',
'overflow:auto;');
3492 document.body.setAttribute(
'style',
'overflow:hidden;');
3494 tempBehaviour=tempBehaviour.replace(
"***",
"'touchonWindow': "+configBehaviour.touchonWindow+
", ***");
3497 configBehaviour.smoothRotation = $(
'input[name=smooth-rotation]').is(
":checked");
3498 tempBehaviour=tempBehaviour.replace(
"***",
"'smoothRotation': '"+configBehaviour.smoothRotation+
"', ***");
3499 if (parseBool(configBehaviour.smoothRotation)) {
3500 configBehaviour.RotationSpeed=$(
'#RotInc').val();
3501 tempBehaviour=tempBehaviour.replace(
"***",
"'RotationSpeed': '"+configBehaviour.smoothRotation+
"', ***");
3502 RotInc=parseFloat(configBehaviour.RotationSpeed);
3508 temp3=
"'shareMenu': { ";
3509 tempBehaviour=tempBehaviour.replace(
"***",temp3+
" ***");
3511 for (var theOption in thisIconTab) {
3512 ThisMenuShared=$(
'input[name=shareMenu_'+thisIconTab[theOption]+
']').is(
":checked");
3513 me.menu.setMenuShareEvent(theOption, ThisMenuShared);
3514 tempBehaviour=tempBehaviour.replace(
"***",
"'"+thisIconTab[theOption]+
"': '"+ThisMenuShared+
"', ***");
3516 for (var locMenu in LocalMenus) {
3517 var menuname=LocalMenus[locMenu].replace(
"GlobalMenuButtonIcon",
"Global")
3518 var thismenu=subMenusGlobal.filter(menu=>menu.getId()==menuname)[0];
3519 var thisiconTab=thismenu.getMenuIconClassAttributesTab();
3520 for (var theOption in thisiconTab) {
3521 ThisMenuShared=$(
'input[name=shareMenu_'+thisiconTab[theOption]+
']').is(
":checked");
3522 thismenu.setMenuShareEvent(theOption, ThisMenuShared);
3523 tempBehaviour=tempBehaviour.replace(
"***",
"'"+thisiconTab[theOption]+
"': '"+ThisMenuShared+
"', ***");
3528 tempBehaviour=tempBehaviour.replace(
", ***",temp3+
", ***");
3530 var tempConfigJson=
"{"
3531 + tempColors.replace(
", ***",
"").replace(
"***",
"")+
","
3533 + tempBehaviour.replace(
", ***",
"").replace(
"***",
"")
3538 return tempConfigJson.replaceAll(
"'",
'"');
3543 $(
'#buttonApply').off(
"click").on({
3547 $(
'#buttonCancel').click();
3551 $(
'#buttonCancel').off(
"click").on(
'click',
function() {
3552 $(
'#'+
id+
'option'+optionNumber).click();
3555 $(
'#buttonSave').off(
"click").on({
3557 ConfigJson = ApplyParameters();
3559 var sessionDate =
new Date();
3560 var strDate=sessionDate.toLocaleDateString({day:
"2-digit", month:
"2-digit"}).replace(/\
3561 var fileName = my_session +
"_" +
"Config_" + strDate +
".json";
3564 download([ConfigJson], fileName, {type:
"text/plain;charset=utf-8"})
3568 cdata ={
"room":my_session,
"Config": ConfigJson.replaceAll(
"'",
'"') }
3569 console.log(
"Share config : "+ConfigJson);
3572 socket.emit(
"share_Config", cdata);
3576 $(
'#buttonShare').off(
"click").on({
3578 ConfigJson = ApplyParameters();
3580 cdata ={
"room":my_session,
"Config": ConfigJson.replaceAll(
"'",
'"') }
3581 console.log(
"Share config : "+ConfigJson);
3584 socket.emit(
"share_Config", cdata);
3590 $(
'#options').remove();
3591 $(
'#options-content-select').remove();
3592 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeOptionsButtonIcon").addClass(
"optionsButtonIcon");
3596 managementGlobalMenuIconClassAttributesTab.push(
"optionsButtonIcon");
3597 managementGlobalMenuShareEvent.push(
false);
3601 UpdateParameters =
function(configJson) {
3602 var tempColors = configJson.colors;
3604 var tempBehaviour = configJson.behaviour;
3608 if (tempColors.hasOwnProperty(
'colorTheme')) {
3609 configColors.colorTheme = tempColors.colorTheme
3610 setColorTheme(configColors.colorTheme);
3617 if(tempBehaviour.hasOwnProperty(
'opacity')) {
3618 configBehaviour.opacity = tempBehaviour.opacity;
3619 for (O in nodesById) {
3620 nodesById[O].setNodeOpacity(configBehaviour.opacity);
3624 if(tempBehaviour.hasOwnProperty(
'spread')) {
3626 X : parseInt(tempBehaviour.spread.X),
3627 Y : parseInt(tempBehaviour.spread.Y)
3630 me.updateSpread(newSpread);
3633 if(tempBehaviour.hasOwnProperty(
'maxNumOfColumns'))
3634 numOfColumns = tempBehaviour.maxNumOfColumns;
3636 if(tempBehaviour.hasOwnProperty(
'spaceBetweenColumns'))
3637 gapBetweenColumns = tempBehaviour.spaceBetweenColumns
3638 if(tempBehaviour.hasOwnProperty(
'spaceBetweenLines'))
3639 gapBetweenLines = tempBehaviour.spaceBetweenLines
3641 maxNumOfColumns=numOfColumns;
3642 mesh.globalLocationProvider();
3644 if(tempBehaviour.hasOwnProperty(
'alwaysShowInfo'))
3645 configBehaviour.alwaysShowInfo = $.parseJSON(tempBehaviour.alwaysShowInfo);
3647 if(tempBehaviour.hasOwnProperty(
'defaultInfoFontSize')) {
3648 configBehaviour.defaultInfoFontSize = tempBehaviour.defaultInfoFontSize;
3649 $(
'.info').css(
"font-size",configBehaviour.defaultInfoFontSize)
3651 if(tempBehaviour.hasOwnProperty(
'defaultFontIndex')) {
3652 configBehaviour.defaultFontIndex = tempBehaviour.defaultFontIndex;
3653 $(
'.info').css(
"font-family", configBehaviour.infoFonts[configBehaviour.defaultFontIndex]);
3656 if(tempBehaviour.hasOwnProperty(
'moveOnlyABorder'))
3657 configBehaviour.moveOnlyABorder = $.parseJSON(tempBehaviour.moveOnlyABorder);
3659 if(tempBehaviour.hasOwnProperty(
'moveOnMenuOption'))
3660 configBehaviour.moveOnMenuOption = $.parseJSON(tempBehaviour.moveOnMenuOption);
3662 if(tempBehaviour.hasOwnProperty(
'moveOnGrid'))
3663 configBehaviour.moveOnGrid = $.parseJSON(tempBehaviour.moveOnGrid);
3665 if(tempBehaviour.hasOwnProperty(
'showAnimationsLineColSwap'))
3666 configBehaviour.showAnimationsLineColSwap = $.parseJSON(tempBehaviour.showAnimationsLineColSwap);
3668 if(tempBehaviour.hasOwnProperty(
'animationSpeed'))
3669 configBehaviour.animationSpeed = tempBehaviour.animationSpeed;
3671 if(tempBehaviour.hasOwnProperty(
'allMSShowMax'))
3672 configBehaviour.allMSShowMax = tempBehaviour.allMSShowMax;
3674 if(tempBehaviour.hasOwnProperty(
'onlyMasterMS'))
3675 configBehaviour.onlyMasterMS = tempBehaviour.onlyMasterMS;
3679 if(tempBehaviour.hasOwnProperty(
'touchSpeed'))
3680 configBehaviour.touchSpeed = tempBehaviour.touchSpeed;
3681 if(tempBehaviour.hasOwnProperty(
'touchonWindow'))
3682 configBehaviour.touchonWindow = tempBehaviour.touchonWindow;
3685 configBehaviour.smoothRotation =
false;
3686 if(tempBehaviour.hasOwnProperty(
'smoothRotation'))
3687 configBehaviour.smoothRotation = $.parseJSON(tempBehaviour.smoothRotation);
3689 if (parseBool(configBehaviour.smoothRotation)) {
3690 if(tempBehaviour.hasOwnProperty(
'RotationSpeed'))
3691 configBehaviour.RotationSpeed = $.parseJSON(tempBehaviour.RotationSpeed);
3692 RotInc=parseFloat(configBehaviour.RotationSpeed);
3705 managementGlobalMenuTitleTab.push(
"Show help page")
3706 managementGlobalMenuEventTab.push(
function(v,
id, optionNumber){
3710 if (initHelp ==
null) {
3711 htmlPrimaryParent.prepend($(
'#helpSupport'));
3712 $(
'#helpSupport').css({
3713 position :
"absolute",
3717 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
3721 backgroundColor :
"black",
3726 $(
'#helpframe').attr(
"height",
"30%").attr(
"width",
"30%").css({
3731 console.log(helpPath);
3732 $(
'#helpSupport').append(
'<div id=buttonClosehelp class=unzoomButtonIcon></div>');
3733 $(
'#helpSupport').append(
"<div id=helpSliderLabel style='background-image: none; color: white; background-color: black; font-size: 80px; padding: 20px; padding-top: 5px; padding-bottom: 5px;'>Zoom</div>");
3734 $(
'#buttonClosehelp').css({
3737 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
3741 backgroundColor:
"rgba(0, 0, 0, 0.5)"
3743 $(
'#buttonClosehelp').off(
"click").on(
'click',
function() {
3744 $(
'#helpSupport').hide();
3745 $(
'#'+
id +
'option'+optionNumber).removeClass(
"closeHelpButtonIcon").addClass(
"helpButtonIcon")
3748 $(
'#helpSliderLabel').css({
3751 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width"))
3752 +parseInt($(
'#buttonClosehelp').css(
"width")),
3756 padding:
"0px 50px",
3762 $(
'#helpSliderLabel').append(
"<input id=helpSlider type='range' name=helpSlider min="+window.devicePixelRatio*100+
" max="+5*window.devicePixelRatio*100+
" value= " +
3763 3*window.devicePixelRatio*100 +
">");
3765 $(
'#helpSlider').css({
3767 top: parseInt($(
'#helpSliderLabel').css(
"height"))/2,
3768 left : (parseInt($(
'#helpSliderLabel').css(
"width"))
3769 +parseInt($(
'#buttonClosehelp').css(
"width")))*1.1,
3771 width: parseInt($(
'header').css(
"width"))/2 - parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
3775 $(
'#helpSlider').change(
function () {
3776 var val = ($(
this).val() - $(
this).attr(
'min')) / ($(
this).attr(
'max') - $(
this).attr(
'min'));
3778 $(
this).css(
'background-image',
3779 '-webkit-gradient(linear, left top, right top, '
3780 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
3781 +
'color-stop(' + val +
', rgb(0, 255, 0))'
3786 var val = ($(
"#helpSlider").val() - $(
"#helpSlider").attr(
'min')) / ($(
"#helpSlider").attr(
'max') - $(
"#helpSlider").attr(
'min'));
3787 $(
'#helpSlider').css(
'background-image',
3788 '-webkit-gradient(linear, left top, right top, '
3789 +
'color-stop(' + val +
', rgb(255, 0, 0)), '
3790 +
'color-stop(' + val +
', rgb(0, 255, 0))'
3795 $(
'#helpframe').css({
3797 top : parseInt($(
'#helpSliderLabel').css(
"height"))
3800 $(
'#helpSlider').off(
"click").on({
3801 click :
function(e){
3802 var newZoom = $(
'#helpSlider').val();
3803 var ratio = newZoom/(window.devicePixelRatio*100);
3804 $(
'#helpframe').css(
"-moz-transform",
"scale("+ratio+
")").css(
"-webkit-transform",
"scale("+ratio+
")").css(
"transform-origin",
"0 0 0");
3808 $(
'#helpSlider').click();
3811 setColorTheme(configColors.colorTheme);
3812 $(
'#helpSupport').show();
3817 $(
'#helpSupport').show();
3820 $(
'#'+
id+
'option'+optionNumber).removeClass(
"helpButtonIcon").addClass(
"closeHelpButtonIcon");
3822 $(
'#buttonClosehelp').click();
3824 managementGlobalMenuIconClassAttributesTab.push(
"helpButtonIcon");
3825 managementGlobalMenuShareEvent.push(
false);
3832 var cancelGlobalMenuTitleTab =
new Array();
3833 var cancelGlobalMenuEventTab =
new Array();
3834 var cancelGlobalMenuIconClassAttributesTab =
new Array();
3835 var cancelGlobalMenuShareEvent =
new Array();
3838 cancelGlobalMenuTitleTab.push(
"Cancel last movement")
3839 cancelGlobalMenuEventTab.push((
function(){
3842 if(!(nodesOldPositions.length-stepBack == -1)) {
3849 var back =
function(){
3853 for(u=0;u<nodesByLoc.length;u++) {
3854 me.switchLocation(me.getNode(nodesOldPositions[nodesOldPositions.length-stepBack][u]),nodesByLoc[u],
true,
false);
3858 if (nodesOldPositions[nodesOldPositions.length - stepBack][nodesByLoc.length]) {
3877 cancelGlobalMenuIconClassAttributesTab.push(
"moveBackButtonIcon");
3878 cancelGlobalMenuShareEvent.push(
true);
3937 cancelGlobalMenuTitleTab.push(
"Redo last cancelled")
3938 cancelGlobalMenuEventTab.push((
function(){
3943 var stepForward = 1-stepBack;
3945 if(stepForward<0 && stepForward + nodesOldPositions.length >= 0) {
3949 var forward =
function(){
3954 for(u=0;u<nodesByLoc.length;u++) {
3955 me.switchLocation(me.getNode(nodesOldPositions[nodesOldPositions.length+stepForward][u]),nodesByLoc[u],
true,
false);
3959 if (stepForward + 1 <= -1) {
3960 var boolCurrIdx = nodesOldPositions[nodesOldPositions.length+stepForward][nodesByLoc.length];
3961 var boolNextIdx = nodesOldPositions[nodesOldPositions.length+stepForward+1][nodesByLoc.length];
3963 if (boolNextIdx || boolCurrIdx) {
3966 stepForward = 1-stepBack;
3969 if(stepForward<0 && stepForward >= -nodesOldPositions.length) {
3974 console.log(
"not in range (forward)");
3989 cancelGlobalMenuIconClassAttributesTab.push(
"moveForwardButtonIcon");
3990 cancelGlobalMenuShareEvent.push(
true);
4052 var updownGlobalMenuTitleTab =
new Array();
4053 var updownGlobalMenuEventTab =
new Array();
4054 var updownGlobalMenuIconClassAttributesTab =
new Array();
4055 var updownGlobalMenuShareEvent =
new Array();
4058 updownGlobalMenuTitleTab.push(
"Move up all lines and place first line on last one")
4059 updownGlobalMenuEventTab.push(
function(v,
id, optionNumber){
4062 updownGlobalMenuIconClassAttributesTab.push(
"upArrowButtonIcon");
4063 updownGlobalMenuShareEvent.push(
true);
4066 updownGlobalMenuTitleTab.push(
"Move down all lines and place last line on first")
4067 updownGlobalMenuEventTab.push(
function(v,
id, optionNumber){
4070 updownGlobalMenuIconClassAttributesTab.push(
"downArrowButtonIcon");
4071 updownGlobalMenuShareEvent.push(
true);
4088 var menuTitleTab =
new Array();
4089 var menuEventTab =
new Array();
4090 var menuIconClassAttributesTab =
new Array();
4091 var menuShareEvent =
new Array();
4104 menuTitleTab.push(
"Filter node through tags and zoom on filtered nodes")
4105 menuEventTab.push(
function(v,
id,optionNumber){
4109 var ratio =spread.Y/spread.X;
4110 var initSpread = spread;
4115 $(
'header').css({height : 250 , width : htmlPrimaryParent.css(
"width")});
4116 _allowDragAndDrop =
false;
4119 $(
'header').append(
"<div id=search></div>");
4123 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
4126 backgroundColor :
"black",
4131 $(
"#search").append(
"<label for=filter>Filter: </label>").append(
"<input id=filter type=text>").css({
4132 position :
"fixed" ,
4134 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
4139 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
4146 $(
'filter').draggable();
4148 $(
'header').append(
"<div id=brush class=brushButtonIcon></div>");
4154 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
4157 var left_ = parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")) + parseInt($(
'#brush').css(
"width"));
4159 var width_ = window.innerWidth - left_;
4162 $(
'header').append(
"<div id=blackboard></div>");
4163 $(
"#blackboard").css({
4177 $(
"#search" ).off(
"autocompleteselect").on(
"autocompleteselect",
function( event, ui ) {
4179 document.getElementById(
"filter").value = ui.item.value;
4183 $(
"#search").off(
"tap focusin").on(
"tap focusin",
4187 $(
"#search").off(
"keydown").on({
4189 keydown :
function(e){
4190 $(
'#internal_warning').remove();
4191 if(e.keyCode == 13) {
4192 var nodeZoomTab =
new Array();
4193 var text_ = $(
'#filter').val();
4195 text_=text_.replace(
'&&',
'&').replace(
'&&',
'&').replace(
' ',
'');
4196 var textTab = text_.split(
"&");
4199 for(e=0;e<textTab.length;e++) {
4201 var nodesbis=nodesById;
4204 if(appliedFilters.indexOf(text_)==-1) {
4207 for(O in nodesbis) {
4208 if(me.hasTag(nodesbis[O],text_)) {
4209 nodeZoomTab.push(nodesById[O]);
4210 me.switchLocation(nodesbis[O],nodesByLoc[w],
false,
true);
4211 nodesbis[O].getHtmlNode().css({
4214 nodesbis[O].getStickers().addSticker(text_,colorFilterStickersTab[numOfFilter],
true);
4220 $(
"#blackboard").append(
'<div id='+text_+
' >'+text_+
'</div>');
4223 width : width_/colorFilterStickersTab.length,
4227 backgroundColor : colorFilterStickersTab[numOfFilter]
4231 $(
"#blackboard").append(
'<div id=internal_warning class="legend-warning">Filter not found on those tiles</div>');
4235 while(w<nodesByLoc.length) {
4236 nodesByLoc[w].getHtmlNode().css({
4242 appliedFilters.push(text_);
4243 $(
'.stickers_zone').css(
"visibility",
"visible");
4263 if(chargeAllContentOnStart==
false) {
4264 me.computeNumColumns();
4265 for(O in nodesById ){
4266 node = nodesById[O];
4267 if( node.getLoadedStatus() ==
false && mesh.locationProvider(node.getIdLocation()).getY()<window.innerHeight ) {
4269 ratio=mesh.loadContent(node.getId());
4270 node.setLoadedStatus(
true);
4280 $(
"#search").off(
"focusout").on({
4281 focusout :
function(){
4283 $(
"#search").off(
'keydown');
4289 $(
"#filter" ).autocomplete({
4291 source: suggestion_list
4295 $(
'#brush').off(
"click").on({
4297 click :
function() {
4300 while(appliedFilters.length>0) {
4301 buffer=appliedFilters.pop();
4310 $(
'#blackboard').children().remove();
4312 for (O in nodesByLoc)
4313 if (nodesByLoc[O].getNodeInViewportStatus()) {
4314 nodesByLoc[O].sub(
'stickers_').css(
"visibility",
"hidden");
4315 nodesByLoc[O].sub(
'').css({
4323 $(
'#'+
id+
'option'+optionNumber).attr(
'class',$(
'#'+
id+
'option'+optionNumber).attr(
'class').replace(
'searchButtonIcon',
'closeSearchButtonIcon'));
4325 $(
"#brush").click();
4326 $(
'#blackboard').remove();
4327 $(
"#filter").remove();
4328 $(
"filter").remove();
4329 $(
"#search").remove();
4330 $(
"#brush").remove();
4331 $(
'#'+
id+
'option'+optionNumber).attr(
'class',$(
'#'+
id+
'option'+optionNumber).attr(
'class').replace(
'closeSearchButtonIcon',
'searchButtonIcon'));
4336 menuIconClassAttributesTab.push(
"searchButtonIcon");
4337 menuShareEvent.push(
false)
4359 menuTitleTab.push(
"Clear selection")
4360 menuEventTab.push(
function(v,
id,optionNumber){
4362 $(
'#'+
id+
'option'+optionNumber).removeClass(
'clearSelectionButtonIcon').addClass(
'closeClearSelectionButtonIcon');
4363 for(O in nodesById) {
4364 nodesById[O].updateSelectedStatus(
false);
4366 me.setZoomSelection(
false);
4367 me.resetNodesToZoom();
4368 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeClearSelectionButtonIcon').addClass(
'clearSelectionButtonIcon');
4369 addBlink($(
'#'+
id+
'option'+optionNumber));
4371 menuIconClassAttributesTab.push(
"clearSelectionButtonIcon");
4372 menuShareEvent.push(
true);
4376 var IntervalClearSelection=100;
4377 var IntervalCloseTagMenu=100;
4378 var IntervalCloseTagButton=100;
4379 var IntervalSelectOffStickers=100;
4380 var IntervalShareSelection=100;
4381 var IntervalAddNextTag=300;
4382 var IntervalCloseSelectTag=100;
4383 var IntervalSelectionToTag=100;
4384 var IntervalApplyToTag=200;
4385 var IntervalcheckCloseSelectTag=100;
4386 var IntervalCloseSelect=100;
4387 var IntervalAlignTag=100;
4388 var IntervalCloseAll=300;
4390 menuTitleTab.push(
"Show next tiles.")
4391 menuEventTab.push(
function(v,
id,optionNumber){
4393 $(
'#'+
id+
'option' + optionNumber).removeClass(
'nextTilesButtonIcon').addClass(
'closeNextTilesButtonIcon');
4395 if ($(
'#'+globalTagsList[0]).position() == undefined)
4396 $(
'.tagsGlobalMenuButtonIcon').click()
4398 me.setSelectTags(
true);
4399 $(
'.clearSelectionButtonIcon').click();
4401 if (nextList.length == 0) {
4402 var numberOff=$(
'.Off').length;
4403 var numberOn=$(
'.On').length;
4405 var numberToView=Math.min(numberOn,numberOff)
4410 funApplyNewTag_CloseMenuButtonIcon=
function(newtag) {
4411 var checkApplyNewTag = setInterval(
function() {
4412 if ( $(
'.'+newtag).length > 0 ) {
4413 clearInterval(checkApplyNewTag);
4414 $(
'.closeSelectTagMenuButtonIcon').click();
4416 }, IntervalApplyToTag)
4419 funEndselectionToTag_taglegendclick=
function(newtag) {
4420 var checkEndselectionToTag = setInterval(
function() {
4421 if ( $(
'.closeSelectionToTagButtonIcon').length) {
4422 clearInterval(checkEndselectionToTag);
4423 $(
'#tag-legend>#'+newtag).click();
4424 funApplyNewTag_CloseMenuButtonIcon(newtag);
4426 }, IntervalSelectionToTag)
4429 funEndaddPageTag_selectionToTagButtonIcon =
function(newtag) {
4430 var checkEndaddPageTag = setInterval(
function() {
4431 if (receive_Add_Tag) {
4432 clearInterval(checkEndaddPageTag);
4433 addBlink($(
'.selectionToTagButtonIcon'));
4434 $(
'.selectionToTagButtonIcon').click()
4435 funEndselectionToTag_taglegendclick(newtag);
4437 }, IntervalAddNextTag)
4440 funCloseSelectTag_emitnewTag =
function(page) {
4441 var checkCloseSelectTag = setInterval(
function() {
4442 if ($(
'.selectTagButtonIcon').length) {
4443 clearInterval(checkCloseSelectTag);
4444 var newtag=
"Page"+page;
4445 console.log(
"New On page ", newtag);
4446 emit_newTag(
id+
'option'+optionNumber,newtag);
4448 funEndaddPageTag_selectionToTagButtonIcon(newtag)
4450 }, IntervalCloseSelectTag)
4453 funEndshareSelectionOn_closeSelectTag =
function(page) {
4454 var checkEndshareSelectionOn = setInterval(
function() {
4455 if (receive_deploy_Selection) {
4456 clearInterval(checkEndshareSelectionOn);
4458 addBlink($(
'.closeSelectTagButtonIcon'));
4459 $(
'.closeSelectTagButtonIcon').click();
4461 funCloseSelectTag_emitnewTag(page);
4463 }, IntervalShareSelection)
4466 funEndselectOnStickers_listSelectionIds =
function(page) {
4467 var checkEndselectOnStickers= setInterval(
function() {
4468 if ( me.getSelectedNodes().length > 0) {
4469 clearInterval(checkEndselectOnStickers);
4471 var selectedNodes=me.getSelectedNodes().filter(node=>{
if (node.getNodeTagList().indexOf(
"On") > -1)
return node});
4473 addBlink($(
'.closeSelectTagButtonIcon'))
4474 me.setSelectTags(false);
4476 var listSelectionIds = [];
4477 var listSelectionTiles=me.getSelectedNodes();
4478 for(O in listSelectionTiles) {
4479 listSelectionIds.push(listSelectionTiles[O].getId());
4482 receive_deploy_Selection=
false;
4483 var cdata ={
"room":my_session,
"Selection":
"["+listSelectionIds.toString()+
"]" }
4484 socket.emit(
"share_Selection", cdata);
4486 funEndshareSelectionOn_closeSelectTag(page);
4488 }, IntervalSelectOffStickers)
4491 funselectTagButton_taglegendOn =
function(page) {
4492 var checkselectTagButton = setInterval(
function() {
4493 if ($(
'.closeSelectTagButtonIcon').length) {
4494 clearInterval(checkselectTagButton);
4496 $(
'#tag-legend>#On').click();
4497 addBlink($(
'#tag-legend>#On'));
4498 console.log(
"Selection On");
4500 funEndselectOnStickers_listSelectionIds(page);
4502 }, IntervalCloseTagButton)
4505 funselectTagMenu_selectTagButtonIcon =
function(page) {
4506 var checkselectTagMenu = setInterval(
function() {
4507 if ($(
'.closeSelectTagMenuButtonIcon').length) {
4508 clearInterval(checkselectTagMenu);
4509 if ($(
'.closeSelectTagButtonIcon').length == 0)
4510 $(
'.selectTagButtonIcon').click();
4512 funselectTagButton_taglegendOn(page);
4514 }, IntervalCloseTagMenu)
4517 funAddOnTagsPage =
function(page) {
4518 var checkEndcloseTagsGlobalMenu=setInterval(
function() {
4519 if ($(
'.closeTagsGlobalMenuButtonIcon').length ) {
4520 clearInterval(checkEndcloseTagsGlobalMenu);
4522 if ($(
'.closeSelectTagMenuButtonIcon').length == 0)
4523 $(
'.selectTagMenuButtonIcon').click();
4524 $(
'.clearSelectionButtonIcon').click()
4525 addBlink($(
'.clearSelectionButtonIcon'));
4527 funselectTagMenu_selectTagButtonIcon(page);
4529 }, IntervalClearSelection)
4537 funCloseAll =
function() {
4538 var checkCloseAll = setInterval(
function() {
4539 if ( EndOfGroupping) {
4540 clearInterval(checkCloseAll);
4542 $(
'.closeAlignTagButtonIcon').click();
4543 $(
'.clearSelectionButtonIcon').click();
4545 }, IntervalCloseAll)
4548 funEndalignTag =
function(newtag) {
4549 var checkEndalignTag = setInterval(
function() {
4550 if ( $(
'.closeAlignTagButtonIcon').length ) {
4551 clearInterval(checkEndalignTag);
4552 EndOfGroupping=
false;
4553 $(
'#tag-legend>#'+newtag).click();
4556 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeNextTilesButtonIcon').addClass(
'nextTilesButtonIcon');
4559 }, IntervalAlignTag)
4562 funCloseSelect =
function(newtag) {
4563 var checkCloseSelect = setInterval(
function() {
4564 if ( $(
'.selectTagMenuButtonIcon').length ) {
4565 clearInterval(checkCloseSelect);
4566 $(
'.alignTagButtonIcon').click();
4567 addBlink($(
'.alignTagButtonIcon'));
4569 funEndalignTag(newtag);
4571 }, IntervalCloseSelect)
4575 funApplyNewTag =
function(newtag) {
4576 var checkApplyNewTag = setInterval(
function() {
4577 if ( $(
'.'+newtag).length > 0 ) {
4578 clearInterval(checkApplyNewTag);
4579 $(
'.closeSelectTagMenuButtonIcon').click();
4581 funCloseSelect(newtag);
4583 }, IntervalApplyToTag)
4586 funEndselectionToTag =
function(newtag) {
4587 var checkEndselectionToTag = setInterval(
function() {
4588 if ( $(
'.closeSelectionToTagButtonIcon').length) {
4589 clearInterval(checkEndselectionToTag);
4590 $(
'#tag-legend>#'+newtag).click();
4592 funApplyNewTag(newtag);
4594 }, IntervalSelectionToTag)
4597 funEndaddNextTag =
function(newtag) {
4598 var checkEndaddNextTag = setInterval(
function() {
4599 if (receive_Add_Tag) {
4600 clearInterval(checkEndaddNextTag);
4601 addBlink($(
'.selectionToTagButtonIcon'));
4602 $(
'.selectionToTagButtonIcon').click()
4604 funEndselectionToTag(newtag);
4606 }, IntervalAddNextTag)
4609 funCloseSelectTag =
function(newtag) {
4610 var checkCloseSelectTag = setInterval(
function() {
4611 if ($(
'.selectTagButtonIcon').length) {
4612 clearInterval(checkCloseSelectTag);
4613 var newtag=
"Next"+nextList.length;
4614 nextList.push(newtag);
4615 console.log(
"Next add New Tag ", newtag);
4616 emit_newTag(
id+
'option'+optionNumber,newtag);
4618 funEndaddNextTag(newtag)
4620 }, IntervalCloseSelectTag)
4623 funEndshareSelectionOff =
function() {
4624 var checkEndshareSelectionOff = setInterval(
function() {
4625 if (receive_deploy_Selection) {
4626 clearInterval(checkEndshareSelectionOff);
4628 addBlink($(
'.closeSelectTagButtonIcon'));
4629 $(
'.closeSelectTagButtonIcon').click();
4631 funCloseSelectTag();
4633 }, IntervalShareSelection)
4636 funEndselectOffStickers =
function() {
4637 var checkEndselectOffStickers = setInterval(
function() {
4638 if ( me.getSelectedNodes().length > 0) {
4639 clearInterval(checkEndselectOffStickers);
4645 var selectedNodes=me.getSelectedNodes().filter(node=>{
if (node.getNodeTagList().indexOf(
"Off") > -1)
return node});
4648 addBlink($(
'.selectTagButtonIcon'))
4649 me.setSelectTags(false);
4651 var listSelectionIds = [];
4652 var listSelectionTiles=me.getSelectedNodes();
4653 for(O in listSelectionTiles) {
4654 listSelectionIds.push(listSelectionTiles[O].getId());
4657 receive_deploy_Selection=
false;
4658 var cdata ={
"room":my_session,
"Selection":
"["+listSelectionIds.toString()+
"]" }
4659 socket.emit(
"share_Selection", cdata);
4662 funEndshareSelectionOff();
4664 }, IntervalSelectOffStickers)
4667 funselectTagButton =
function() {
4668 var checkselectTagButton = setInterval(
function() {
4669 if ($(
'.closeSelectTagButtonIcon').length) {
4670 clearInterval(checkselectTagButton);
4672 if (nextList.length < 1) {
4674 $(
'#tag-legend>#Off').click();
4675 addBlink($(
'#tag-legend>#Off'));
4676 console.log(
"Selection Off");
4679 var oldtag=
"Next"+(nextList.length-1);
4681 $(
'#tag-legend>#'+oldtag).click();
4682 addBlink($(
'#tag-legend>#'+oldtag));
4683 console.log(
"Selection "+oldtag);
4686 funEndselectOffStickers();
4688 }, IntervalCloseTagButton)
4691 funselectTagMenu =
function() {
4692 var checkselectTagMenu = setInterval(
function() {
4693 if ($(
'.closeSelectTagMenuButtonIcon').length) {
4694 clearInterval(checkselectTagMenu);
4695 if ($(
'.closeSelectTagButtonIcon').length == 0)
4696 $(
'.selectTagButtonIcon').click();
4698 funselectTagButton();
4700 }, IntervalCloseTagMenu)
4703 funEndcloseTagsGlobalMenu =
function() {
4704 var checkEndcloseTagsGlobalMenu = setInterval(
function() {
4705 if ($(
'.closeTagsGlobalMenuButtonIcon').length ) {
4706 clearInterval(checkEndcloseTagsGlobalMenu);
4711 if ($(
'.closeSelectTagMenuButtonIcon').length == 0)
4712 $(
'.selectTagMenuButtonIcon').click();
4713 $(
'.clearSelectionButtonIcon').click()
4714 addBlink($(
'.clearSelectionButtonIcon'));
4721 }, IntervalClearSelection)
4725 funnext=
new Array(funEndalignTag,funCloseSelect);
4728 funEndcloseTagsGlobalMenu();
4730 menuIconClassAttributesTab.push(
"nextTilesButtonIcon");
4731 menuShareEvent.push(
false);
4734 menuTitleTab.push(
"Show rotate button")
4735 menuEventTab.push( (
function(){
4737 return function(v, id, optionNumber){
4739 $(
'.rotate').show();
4740 $(
'#'+
id+
'option'+optionNumber).removeClass(
'RotateButtonIcon').addClass(
'closeRotateButtonIcon');
4742 $(
'.rotate').hide();
4743 $(
'#'+
id+
'option'+optionNumber).removeClass(
"closeRotateButtonIcon").addClass(
"RotateButtonIcon");
4750 menuIconClassAttributesTab.push(
"RotateButtonIcon");
4751 menuShareEvent.push(
false);
4760 menuTitleTab.push(
"Refresh all nodes")
4761 menuEventTab.push(
function (v){
4769 menuIconClassAttributesTab.push(
"refreshButtonIcon");
4770 menuShareEvent.push(
true);
4775 menuTitleTab.push(
"Tag menu")
4776 menuEventTab.push(
function(v,
id, optionNumber){
4778 for (O in nodesByLoc) {
4779 if (nodesByLoc[O].getNodeInViewportStatus()) {
4780 nodesByLoc[O].sub(
'hitbox').off(
"click");
4781 if (!!configBehaviour.moveOnMenuOption) {
4782 nodesByLoc[O].sub(
'').off();
4784 nodesByLoc[O].sub(
'hitbox').on(
"click", clickHBTag);
4787 menuTags.css(
"visibility",
"visible");
4789 var left_ = Math.max(parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")),
4791 parseInt($(me.tagMenu.getHtmlMenuSelector()).css(
"width")));
4793 var width_= parseInt($(
'#home').position().left)-250 -left_;
4795 var width_= parseInt($(
'header').css(
'width')) - left_ -600 ;
4798 var tmp = document.getElementById(
"tag-legend");
4801 menuTags.append(
'<div id=tag-legend class=legend scrollable="yes"></div>');
4803 $(
'#tag-legend').css({
4804 position :
"relative",
4814 $(
'body').append(
'<div id=tag-notif class=tag-notif></div>');
4815 $(
'#tag-notif').text(
"click on an icon then a color to use tags.");
4817 $(
'#tag-legend').show();
4818 $(
'#tag-notif').show();
4819 $(
'.stickers_zone').css(
"visibility",
"visible");
4824 if (typeof(computedTagsList) ==
"undefined") {
4825 computedTagsList = [];
4827 if (computedTagsList.length == 0) {
4828 if (configTagsBehaviour.showAll) {
4829 computedTagsList = globalTagsList.sort();
4831 else if (configTagsBehaviour.selectionMethod ==
"frequency") {
4833 var tagHisto =
new Array ();
4835 for (var k=0;k<globalTagsList.length;k++) {
4836 for (var i=0;i<me.getCardinal();i++) {
4837 if(me.hasTag(nodesByLoc[i],globalTagsList[k])) {
4844 var maxValues =
new Array();
4846 for(var k=0;k<Math.min(configTagsBehaviour.numOfTagsToShow, globalTagsList.length);k++) {
4847 maxValues[k] = $.inArray(Math.max.apply(
null, tagHisto), tagHisto);
4848 computedTagsList.push(globalTagsList[maxValues[k]]);
4850 tagHisto[maxValues[k]] = - (k+1);
4851 if (computedTagsList.length <= colorTagStickersTab.length) {
4852 attributedTagsColorsArray[computedTagsList[computedTagsList.length-1]] = colorTagStickersTab[computedTagsList.length-1];
4853 }
else if (computedTagsList.length<(colorTagStickersTab.length + colorFilterStickersTab.length-2)) {
4854 attributedTagsColorsArray[computedTagsList[computedTagsList.length-1]] =
4855 colorFilterStickersTab[computedTagsList.lengthk-colorTagStickersTab.length];
4857 attributedTagsColorsArray[computedTagsList[computedTagsList.length-1]] =
4858 "rgb("+Math.floor(Math.random()*255) +
", " + Math.floor(Math.random()*255)+
", " + Math.floor(Math.random()*255)+
")";
4860 for(O in nodesByLoc) {
4861 if(me.hasTag(nodesByLoc[O], computedTagsList[k]) ) {
4862 var color = attributedTagsColorsArray[computedTagsList[k]];
4863 nodesByLoc[O].getStickers().addSticker(computedTagsList[k],
false, color);
4869 else if(configTagsBehaviour.selectionMethod ==
"alphabet") {
4870 computedTagsList = globalTagsList.slice(0, configTagsBehaviour.numOfTagsToShow);
4874 if ($(
'#tag-legend').children(
".tag").length<computedTagsList.length) {
4876 for(k=0;k<computedTagsList.length;k++) {
4878 var ck=computedTagsList[k]
4882 if ( ck in globalFloatingTags ) {
4883 var symb=globalFloatingTags[ck][
"symb"]
4884 $(
'#tag-legend').append(
'<div id =' + ck +
' class=tag>'+ck +
" "+ symb +
'</div>');
4885 ComputedTag=$(
'#' + ck);
4887 'background':
'linear-gradient(to right,'+globalFloatingTags[ck][
"cm"]+
','+globalFloatingTags[ck][
"cM"]+
')'
4890 $(
'#tag-legend').append(
'<div id =' + ck +
' class=tag>' + ck +
'</div>');
4891 ComputedTag=$(
'#' + ck);
4893 backgroundColor : attributedTagsColorsArray[ck]
4896 if ( ComputedTag.position().top+ComputedTag.height() > $(
"#tag-legend").height() ) {
4897 $(
"#tag-legend").css({height: ComputedTag.position().top + ComputedTag.height()+10});
4901 for (O in nodesByLoc)
4902 if (nodesByLoc[O].getNodeInViewportStatus())
4903 nodesByLoc[O].sub(
'stickers_').show();
4905 TagHeight=($(
"#tag-legend").height());
4906 if ( my_user !=
"Anonymous" ) {
4908 htmlPrimaryParent.css(
"marginTop",TopPP+
"px");;
4914 for(O in nodesByLoc) {
4915 me.AddNewTag(
"pos"+nodesByLoc[O].getId());
4916 nodesByLoc[O].getStickers().addSticker(
"pos"+nodesByLoc[O].getId(), attributedTagsColorsArray[
"pos"+nodesByLoc[O].getId()],
false);
4917 nodesByLoc[O].addElementToNodeTagList(
"pos"+nodesByLoc[O].getId());
4920 for(O in nodesByLoc) {
4921 nodesByLoc[O].getStickers().updateStickers();
4924 $(
'.stickers_zone').css(
"visibility",
"visible");
4928 $(
'.tag').off(
"click").on({
4929 click : clickTagInLegend
4932 $(
'.sticker').off(
"click").on({
4933 click : clickSticker
4936 $(
'#'+
id+
'option'+optionNumber).removeClass(
'tagsGlobalMenuButtonIcon').addClass(
'closeTagsGlobalMenuButtonIcon');
4939 me.tagMenu.closeAllOptions();
4940 menuTags.css(
"visibility",
"hidden");
4941 $(
'#tag-notif').hide();
4952 $(
'.stickers_zone').css(
"visibility",
"hidden");
4953 $(
'#tag-legend').hide();
4954 if(currentSelectedTag !=
"") {
4955 $(
'#'+currentSelectedTag).css(
"outlineStyle",
"none");
4957 currentSelectedTag =
"";
4958 $(
'#new-tag').remove();
4959 $(
'#add-tag').remove();
4961 $(
'new-tag').remove();
4962 me.meshEventReStart();
4971 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeTagsGlobalMenuButtonIcon').addClass(
'tagsGlobalMenuButtonIcon');
4975 menuIconClassAttributesTab.push(
'tagsGlobalMenuButtonIcon');
4976 menuShareEvent.push(
true)
4980 menuTitleTab.push(
"All action functions Menu")
4981 menuEventTab.push(
function(v,
id, optionNumber){
4984 .css(
"top", (
function(){
4985 return menuGlobal.position()[
"top"]+$(
'.actionGlobalMenuButtonIcon').position()[
"top"];
4987 .css(
"left",menuGlobal.position()[
"left"]+menuGlobal.width())
4988 .css(
"visibility",
"visible");
4992 for (O in nodesByLoc)
4993 if (nodesByLoc[O].getNodeInViewportStatus()) {
4994 nodesByLoc[O].sub(
'').off();
4995 nodesByLoc[O].sub(
'hitbox').off(
"click").on(
"click", clickHBSelect);
4996 nodesByLoc[O].sub(
'hitbox').off(
"mouseenter");
4998 me.resetNodesToZoom();
4999 me.setZoomSelection(
true);
5000 $(
'#'+
id+
'option'+optionNumber).removeClass(
'actionGlobalMenuButtonIcon').addClass(
'closeActionGlobalMenuButtonIcon');
5002 me.actionGlobalMenu.closeAllOptions();
5003 menuActionGlobal.css(
"visibility",
"hidden");
5004 me.setZoomSelection(
false);
5005 for (O in nodesByLoc)
5006 if (nodesByLoc[O].getNodeInViewportStatus())
5007 nodesByLoc[O].sub(
'hitbox').off(
"click").on(
"click", clickHB);
5008 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeActionGlobalMenuButtonIcon').addClass(
'actionGlobalMenuButtonIcon');
5011 menuIconClassAttributesTab.push(
"actionGlobalMenuButtonIcon");
5012 menuShareEvent.push(
false);
5015 menuTitleTab.push(
"All zoom functions Menu")
5016 menuEventTab.push(
function(v,
id, optionNumber){
5019 .css(
"top", (
function(){
5020 return menuGlobal.position()[
"top"]+$(
'.zoomGlobalMenuButtonIcon').position()[
"top"];
5022 .css(
"left",menuGlobal.position()[
"left"]+menuGlobal.width())
5023 .css(
"visibility",
"visible");
5024 $(
'#'+
id+
'option'+optionNumber).removeClass(
'zoomGlobalMenuButtonIcon').addClass(
'closeZoomGlobalMenuButtonIcon');
5026 me.zoomGlobalMenu.closeAllOptions();
5027 menuZoomGlobal.css(
"visibility",
"hidden");
5028 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeZoomGlobalMenuButtonIcon').addClass(
'zoomGlobalMenuButtonIcon');
5031 menuIconClassAttributesTab.push(
"zoomGlobalMenuButtonIcon");
5032 menuShareEvent.push(
false);
5036 menuTitleTab.push(
"All management functions Menu")
5037 menuEventTab.push(
function(v,
id, optionNumber){
5039 menuManagementGlobal
5040 .css(
"top",menuGlobal.position()[
"top"]+menuGlobal.height())
5041 .css(
"left",menuGlobal.position()[
"left"])
5042 .css(
"visibility",
"visible");
5043 $(
'#'+
id+
'option'+optionNumber).removeClass(
'managementGlobalMenuButtonIcon').addClass(
'closeManagementGlobalMenuButtonIcon');
5045 me.managementGlobalMenu.closeAllOptions();
5046 menuManagementGlobal.css(
"visibility",
"hidden");
5047 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeManagementGlobalMenuButtonIcon').addClass(
'managementGlobalMenuButtonIcon');
5050 menuIconClassAttributesTab.push(
"managementGlobalMenuButtonIcon");
5051 menuShareEvent.push(
false);
5054 menuTitleTab.push(
"All state of tile functions")
5055 menuEventTab.push(
function(v,
id, optionNumber){
5058 .css(
"top", (
function(){
5059 return menuGlobal.position()[
"top"]+$(
'.stateGlobalMenuButtonIcon').position()[
"top"];
5061 .css(
"left",menuGlobal.position()[
"left"]+menuGlobal.width())
5062 .css(
"visibility",
"visible");
5063 $(
'#'+
id+
'option'+optionNumber).removeClass(
'stateGlobalMenuButtonIcon').addClass(
'closeStateGlobalMenuButtonIcon');
5067 menuStateGlobal.css(
"visibility",
"hidden");
5068 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeStateGlobalMenuButtonIcon').addClass(
'stateGlobalMenuButtonIcon');
5071 menuIconClassAttributesTab.push(
"stateGlobalMenuButtonIcon");
5072 menuShareEvent.push(
false);
5075 menuTitleTab.push(
"Display/Hide the node menu")
5076 menuEventTab.push(
function(v,
id,optionNumber){
5077 if (executeAtEndComplete) {
5079 if (!!configBehaviour.moveOnNodeMenuOption) {
5080 for (O in nodesByLoc)
5081 if (nodesByLoc[O].getNodeInViewportStatus()) {
5082 nodesByLoc[O].sub(
'').off();
5083 nodesByLoc[O].sub(
'hitbox').off();
5087 for (O in nodesByLoc)
5088 if (nodesByLoc[O].getNodeInViewportStatus())
5089 nodesByLoc[O].getHtmlNode().children(
".nodemenu").css({visibility :
"visible"});
5091 $(
'#'+
id+
'option'+optionNumber).attr(
'class',$(
'#'+
id+
'option'+optionNumber).attr(
'class').replace(
'nodeMenuButton',
'closeNodeMenuButton'));
5095 for (O in nodesByLoc)
5096 if (nodesByLoc[O].getNodeInViewportStatus()) {
5098 var mymenu=nodesByLoc[O].getNodeMenu();
5099 for(p=0;p<mymenu.getEventSelectedTab().length;p++) {
5100 if(mymenu.getEventSelectedTab()[p]==
true) {
5101 $(
"#menu"+mymenu.getId()+
">#option"+p).click();
5105 $(
"#menu"+mymenu.getId()).css({visibility :
"hidden"});
5109 me.meshEventReStart();
5110 $(
'#'+
id+
'option'+optionNumber).attr(
'class',$(
'#'+
id+
'option'+optionNumber).attr(
'class').replace(
'closeNodeMenuButton',
'nodeMenuButton'));
5114 menuIconClassAttributesTab.push(
"nodeMenuButtonIcon");
5115 menuShareEvent.push(
true);
5119 menuTitleTab.push(
"cancel/redo Menu")
5120 menuEventTab.push(
function(v,
id, optionNumber){
5123 .css(
"top", (
function(){
5124 return menuGlobal.position()[
"top"]+$(
'.cancelGlobalMenuButtonIcon').position()[
"top"];
5126 .css(
"left",menuGlobal.position()[
"left"]+menuGlobal.width())
5127 .css(
"visibility",
"visible");
5128 $(
'#'+
id+
'option'+optionNumber).removeClass(
'cancelGlobalMenuButtonIcon').addClass(
'closeCancelGlobalMenuButtonIcon');
5130 me.cancelGlobalMenu.closeAllOptions();
5131 menuCancelGlobal.css(
"visibility",
"hidden");
5132 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeCancelGlobalMenuButtonIcon').addClass(
'cancelGlobalMenuButtonIcon');
5135 menuIconClassAttributesTab.push(
"cancelGlobalMenuButtonIcon");
5136 menuShareEvent.push(
false);
5140 menuTitleTab.push(
"up/down Menu")
5141 menuEventTab.push(
function(v,
id, optionNumber){
5144 .css(
"top", (
function(){
5145 return menuGlobal.position()[
"top"]+$(
'.updownGlobalMenuButtonIcon').position()[
"top"];
5147 .css(
"left",menuGlobal.position()[
"left"]+menuGlobal.width())
5148 .css(
"visibility",
"visible");
5149 $(
'#'+
id+
'option'+optionNumber).removeClass(
'updownGlobalMenuButtonIcon').addClass(
'closeUpdownGlobalMenuButtonIcon');
5151 menuUpdownGlobal.css(
"visibility",
"hidden");
5152 $(
'#'+
id+
'option'+optionNumber).removeClass(
'closeUpdownGlobalMenuButtonIcon').addClass(
'updownGlobalMenuButtonIcon');
5155 menuIconClassAttributesTab.push(
"updownGlobalMenuButtonIcon");
5156 menuShareEvent.push(
false);
5162 this.menu =
new Menu(
"Global",$(
'header'),menuTitleTab,menuEventTab,menuIconClassAttributesTab,menuShareEvent,{
5164 top : $(
'#notifications').height(),
5166 visible :
"visible",
5173 menuGlobal=$(
'#menuGlobal');
5175 subMenusGlobal=Array();
5177 this.tagMenu =
new Menu(
"tagsGlobal", $(
'header'), tagMenuTitleTab, tagMenuEventTab, tagMenuIconClassAttributesTab, tagMenuShareEvent,{
5180 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5193 menuTags=$(
'#menutagsGlobal');
5194 subMenusGlobal.push(this.tagMenu);
5196 this.actionGlobalMenu =
new Menu(
"actionGlobal", $(
'header'), actionGlobalMenuTitleTab, actionGlobalMenuEventTab, actionGlobalMenuIconClassAttributesTab, actionGlobalMenuShareEvent,{
5198 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5199 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5205 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5213 menuActionGlobal=$(
'#menuactionGlobal');
5214 subMenusGlobal.push(this.actionGlobalMenu);
5216 this.zoomGlobalMenu =
new Menu(
"zoomGlobal", $(
'header'), zoomGlobalMenuTitleTab, zoomGlobalMenuEventTab, zoomGlobalMenuIconClassAttributesTab, zoomGlobalMenuShareEvent,{
5218 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5219 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5225 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5233 menuZoomGlobal=$(
'#menuzoomGlobal');
5234 subMenusGlobal.push(this.zoomGlobalMenu);
5236 this.managementGlobalMenu =
new Menu(
"managementGlobal", $(
'header'), managementGlobalMenuTitleTab, managementGlobalMenuEventTab, managementGlobalMenuIconClassAttributesTab, managementGlobalMenuShareEvent,{
5238 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5239 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'left')),
5245 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5253 menuManagementGlobal=$(
'#menumanagementGlobal');
5254 subMenusGlobal.push(this.managementGlobalMenu);
5256 this.stateGlobalMenu =
new Menu(
"stateGlobal", $(
'header'), stateGlobalMenuTitleTab, stateGlobalMenuEventTab, stateGlobalMenuIconClassAttributesTab, stateGlobalMenuShareEvent,{
5258 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5259 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5265 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5273 menuStateGlobal=$(
'#menustateGlobal');
5274 subMenusGlobal.push(this.stateGlobalMenu);
5276 this.cancelGlobalMenu =
new Menu(
"cancelGlobal", $(
'header'), cancelGlobalMenuTitleTab, cancelGlobalMenuEventTab, cancelGlobalMenuIconClassAttributesTab, cancelGlobalMenuShareEvent,{
5278 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5279 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5285 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5293 menuCancelGlobal=$(
'#menucancelGlobal');
5294 subMenusGlobal.push(this.cancelGlobalMenu);
5296 this.updownGlobalMenu =
new Menu(
"updownGlobal", $(
'header'), updownGlobalMenuTitleTab, updownGlobalMenuEventTab, updownGlobalMenuIconClassAttributesTab, updownGlobalMenuShareEvent,{
5298 top : parseInt($(me.menu.getHtmlMenuSelector()).css(
'height')),
5299 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5305 backgroundColor:
"rgba(0, 0, 0, 0.6)",
5313 menuUpdownGlobal=$(
'#menuupdownGlobal');
5314 subMenusGlobal.push(this.updownGlobalMenu);
5316 var menutagsGlobaljs=document.getElementById(
"menutagsGlobal");
5317 this.drawMenu =
new Menu(
"Draw", $(
'header'), drawMenuTitleTab, drawMenuEventTab, drawMenuIconClassAttributesTab, drawMenuShareEvent,{
5320 left : menutagsGlobaljs.offsetLeft+$(
'#menutagsGlobal').width(),
5333 menuDraw=$(
'#menuDraw');
5335 this.zoomMenu =
new Menu(
"Zoom", $(
'header'), zoomMenuTitleTab, zoomMenuEventTab, zoomMenuIconClassAttributesTab, zoomMenuShareEvent, {
5338 left : menutagsGlobaljs.offsetLeft+$(
'#menutagsGlobal').width(),
5340 classN :
'zoomAction',
5351 menuZoom=$(
'#menuZoom');
5353 this.MSMenu =
new Menu(
"MS", $(
'header'), MSMenuTitleTab, MSMenuEventTab, MSMenuIconClassAttributesTab, MSMenuShareEvent, {
5356 left : menutagsGlobaljs.offsetLeft+$(
'#menutagsGlobal').width(),
5358 classN :
'masterslave',
5369 menuMS=$(
'#menuMS');
5371 this.tagAlignOrderTagsMenu =
new Menu(
"AlignOrderTags", $(
'header'), tagAlignOrderTagsMenuTitleTab, tagAlignOrderTagsMenuEventTab, tagAlignOrderTagsMenuIconClassAttributesTab, tagAlignOrderTagsMenuShareEvent,{
5374 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5376 classN :
'tagalignOrdertags',
5380 backgroundColor:
"rgba(0, 0, 0, 0.5)",
5388 menuAlignOrderTags=$(
'#menuAlignOrderTags');
5390 this.tagHideTagsMenu =
new Menu(
"HideTags", $(
'header'), tagHideTagsMenuTitleTab, tagHideTagsMenuEventTab, tagHideTagsMenuIconClassAttributesTab, tagHideTagsMenuShareEvent,{
5393 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5395 classN :
'taghidetags',
5399 backgroundColor:
"rgba(0, 0, 0, 0.5)",
5407 menuHideTags=$(
'#menuHideTags');
5409 this.tagSelectionMenu =
new Menu(
"SelectionTags", $(
'header'), tagSelectionMenuTitleTab, tagSelectionMenuEventTab, tagSelectionMenuIconClassAttributesTab, tagSelectionMenuShareEvent,{
5412 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5414 classN :
'tagselect',
5418 backgroundColor:
"rgba(0, 0, 0, 0.5)",
5426 menuSelectionTags=$(
'#menuSelectionTags');
5428 this.tagManagementMenu =
new Menu(
"ManagementTags", $(
'header'), tagManagementMenuTitleTab, tagManagementMenuEventTab, tagManagementMenuIconClassAttributesTab, tagManagementMenuShareEvent,{
5431 left : parseInt($(me.menu.getHtmlMenuSelector()).css(
'width')),
5433 classN :
'tagmanage',
5437 backgroundColor:
"rgba(0, 0, 0, 0.5)",
5445 menuManagementTags=$(
'#menuManagementTags');
5450 this.getcolumnSelected =
function(){
5451 return columnSelected;
5457 this.getlineSelected =
function(){
5458 return lineSelected;
5462 this.setcolumnSelected =
function(number){
5463 columnSelected = number;
5469 this.setlineSelected =
function(number){
5470 lineSelected = number ;
5478 this.getNumOfColumns =
function(){
5479 return numOfColumns;
5485 this.setNodes =
function(){
5492 this.getHeightTab =
function(){
5497 this.getWidthTab =
function(){
5503 this.setHeightTab =
function(index,value){
5504 heightTab[index]=value;
5508 this.setWidthTab =
function(index,value){
5509 widthTab[index]=value;
5514 this.updateSpread = (
function(){
5515 var initialSpread=spread;
5518 return function(newSpread,id){
5521 var scaleX=(newSpread.X/ initialSpread.X);
5522 var scaleY=(newSpread.Y/ initialSpread.Y);
5523 scale = (scaleX + scaleY)/2;
5525 if(typeof
id ==
'undefined' || typeof
id !=
'number' || (
id < 0) || !(
id < nodeCardinal)) {
5527 for(O in nodesById) {
5528 nodesById[O].updateHW(spread.Y,spread.X);
5531 $(
'.selection').css({height : spread.Y, width : spread.X});
5532 $(
'iframe').height(spread.Y).width(spread.X);
5536 $(
'.onoff').css(
"height",parseInt(spread.Y*0.1)).css(
"width",parseInt(spread.Y*0.1)).css(
"left",-parseInt(spread.Y*0.1)).css(
"z-index", 161);
5537 $(
'.hitbox').css(
"height", parseInt(spread.Y*0.9)).css(
"top",parseInt(spread.Y*0.1));
5538 $(
'.info').css(
"font-size", Math.min(configBehaviour.maxInfoFontSize,parseInt(configBehaviour.defaultInfoFontSize*scale)));
5540 for(O in nodesById) {
5541 if(ColumnStyle==
"static")
5545 var node=nodesById[O];
5546 me.setLocation(node,node.getIdLocation(),
false).done(updateNode(node));
5549 $(
'#iframe'+nodesById[O].getId()).css({marginTop : 0 , marginLeft : 0 });
5554 var node=nodesById[O];
5555 me.setLocation(node,node.getIdLocation(),
false).done(updateNode(node));
5557 $(
'#iframe'+nodesById[O].getId()).css({marginTop : 0,marginLeft : 0 });
5562 $(
'.stickers_zone').css(
"left", spread.X);
5564 configBehaviour.defaultInfoFontSize = $(
'.info').css(
"font-size");
5570 nodesById[
"node"+id].updateHW(spread.Y,spread.X);
5573 $(
'.selection').css({height : spread.Y, width : spread.X});
5574 $(
'iframe').height(spread.Y).width(spread.X);
5577 $(
'.onoff').css(
"height",parseInt(spread.Y*0.1)).css(
"width",parseInt(spread.Y*0.1)).css(
"left",-parseInt(spread.Y*0.1));
5578 $(
'.hitbox').css(
"height", parseInt(spread.Y*0.9)).css(
"top",parseInt(spread.Y*0.1));
5580 $(
'.info').css(
"font-size", Math.min(configBehaviour.maxInfoFontSize,parseInt(configBehaviour.defaultInfoFontSize*scale)));
5583 if(ColumnStyle==
"static") {
5584 var marginleft = (parseInt($(
'#'+nodesById[
"node"+
id].getId()).css(
"width"))-widthTab[nodesById[
"node"+id].getId()]*scale)/2;
5585 var node=nodesById[
"node"+id];
5586 me.setLocation(node,node.getIdLocation(),
false).done(updateNode(node));
5587 var margintop = (parseInt($(
'#'+nodesById[
"node"+
id].getId()).css(
"height"))-heightTab[nodesById[
"node"+id].getId()]*scale)/2;
5589 $(
'#iframe'+nodesById[
"node"+
id].getId()).css({marginTop : 0 , smarginLeft : 0 });
5592 var marginleft = (parseInt($(
'#'+nodesById[
"node"+
id].getId()).css(
"width"))-widthTab[nodesById[
"node"+id].getId()]*scale)/2;
5593 var node=nodesById[
"node"+id];
5594 me.setLocation(node,node.getIdLocation(),
false).done(updateNode(node));
5595 var margintop = (parseInt($(
'#'+nodesById[
"node"+
id].getId()).css(
"height"))-heightTab[nodesById[
"node"+id].getId()]*scale)/2;
5596 $(
'#iframe'+nodesById[
"node"+
id].getId()).css({marginTop : margintop,marginLeft : marginleft });
5598 $(
'.stickers_zone').css(
"left", spread.X);
5600 configBehaviour.defaultInfoFontSize = $(
'.info').css(
"font-size");
5608 this.getSpread =
function(){
5615 this.getCardinal =
function(){
5616 return nodeCardinal;
5620 this.setCardinal =
function(n){
5630 this.getNode =
function(id){
5631 return nodesById[
"node"+id];
5637 this.getNodes =
function(){
5645 this.getNodesByLoc =
function(){
5650 setNodesByLoc =
function(idLocation,node){
5651 nodesByLoc[idLocation]=node;
5658 var widthScreen = htmlPrimaryParent.width();
5659 this.computeNumColumns =
function(newNumOfColumns){
5661 newNumOfColumns = newNumOfColumns ||
false;
5663 if (newNumOfColumns !=
false) {
5664 numOfColumns = Math.min(newNumOfColumns, maxNumOfColumns);
5666 widthScreen = htmlPrimaryParent.width();
5671 Math.floor((widthScreen-parseInt($(me.menu.getHtmlMenuSelector()).css(
"width")))/(spread.X+borderSize)),
5681 this.mlocationProvider =
function(node_idLocation){
5682 var nX =node_idLocation%numOfColumns ;
5683 var nY = Math.floor(node_idLocation/numOfColumns);
5684 return (
new MLocation(nX,nY));
5691 var ppol=primaryparent.offsetLeft;
5692 var ppot=$(
".main-legend-zone").height();
5695 this.locationProvider =
function(node_idLocation){
5697 var temp = me.mlocationProvider(node_idLocation);
5698 var nX =temp.getnX();
5699 var nY =temp.getnY();
5701 var x = nX*(spread.X + gapBetweenColumns + borderSize)+ppol;
5703 var y = nY*(spread.Y + gapBetweenLines + borderSize)+ppot;
5704 return (
new Location(x,y));
5708 this.globalLocationProvider =
function(){
5710 for(O in nodesById) {
5711 if(!$(
'#' + nodesById[O].getId()).hasClass(
"transparentNode")) {
5712 nodesById[O].setLocation(me.locationProvider(nodesById[O].getIdLocation()),
false);
5713 setNodesByLoc(nodesById[O].getIdLocation(),nodesById[O]);
5715 $(
'#'+nodesById[O].getId()).css(
"z-index", 899);
5725 this.setLocation =
function(node, IdLoc, boolAnimation, animationSpeed) {
5726 boolAnimation = boolAnimation ||
false;
5727 animationSpeed = animationSpeed || configBehaviour.animationSpeed;
5728 node.setLocation(me.locationProvider(IdLoc),boolAnimation,animationSpeed);
5729 setNodesByLoc(node.getIdLocation(),node);
5730 return $.Deferred().resolve();
5732 var updateNode =
function(node) {
5734 if (node.getNodeInViewportStatus()) {
5735 node.setOnOffStatus(
true);
5742 this.switchLocation =
function(node1,node2,boolAnimation,boolSavePosition, boolBlockMove){
5743 boolBlockMove = boolBlockMove ||
false;
5744 if(boolSavePosition==
true)
5745 me.savePositions(boolBlockMove);
5746 var tampon = node1.getIdLocation();
5748 node1.setIdLocation(node2.getIdLocation());
5749 node2.setIdLocation(tampon);
5755 node1.setLocation(me.locationProvider(node1.getIdLocation()),boolAnimation,configBehaviour.animationSpeed);
5756 node2.setLocation(me.locationProvider(node2.getIdLocation()),boolAnimation,configBehaviour.animationSpeed);
5759 setNodesByLoc(node2.getIdLocation(),node2);
5760 setNodesByLoc(node1.getIdLocation(),node1);
5761 node1.setNodeInViewportStatus();
5762 node2.setNodeInViewportStatus();
5767 this.switchLocationShiftColumnLine =
function(node1,node2,boolAnimation,boolSavePosition){
5769 var lineDrag =this.mlocationProvider( node1.getIdLocation() ).getnY();
5770 var columnDrag =this.mlocationProvider( node1.getIdLocation() ).getnX();
5771 var lineDrop =this.mlocationProvider( node2.getIdLocation() ).getnY();
5772 var columnDrop =this.mlocationProvider( node2.getIdLocation() ).getnX();
5774 this.setlineSelected( lineDrop );
5775 this.setcolumnSelected( columnDrop );
5788 var ListMoveNodes= [];
5792 for(O in this.getNodesByLoc()) {
5793 nX[O]=this.mlocationProvider( this.getNodesByLoc()[O].getIdLocation()).getnX();
5794 nY[O]=this.mlocationProvider( this.getNodesByLoc()[O].getIdLocation()).getnY();
5797 if ( lineDrag > lineDrop ) {
5798 if ( columnDrag > columnDrop ) {
5800 for(O in this.getNodesByLoc()) {
5802 if (nX[O] == columnDrop && lineDrag > nY[O] && !(nY[O] < lineDrop) ) {
5803 this.getNodesByLoc()[O].getHtmlNode().css({
5804 boxShadow:
"0 0 0 10px blue"});
5805 ListMoveNodes.push(this.getNodesByLoc()[O])
5807 }
else if ( !(nX[O] < columnDrop) && nY[O] == lineDrag && !(nX[O] > columnDrag) ) {
5808 this.getNodesByLoc()[O].getHtmlNode().css({
5809 boxShadow:
"0 0 0 10px red"});
5810 ListMoveNodes.push(this.getNodesByLoc()[O])
5816 for(O in this.getNodesByLoc()){
5817 if (nX[O] == columnDrop && lineDrag > nY[O] && !(nY[O] < lineDrop) ) {
5818 this.getNodesByLoc()[O].getHtmlNode().css({
5819 boxShadow:
"0 0 0 10px blue"});
5820 ListMoveNodes.push(this.getNodesByLoc()[O])
5825 for(O in this.getNodesByLoc()) {
5826 if ( !(nX[O] < columnDrag) && nY[O] == lineDrag && !(nX[O] > columnDrop) ) {
5827 this.getNodesByLoc()[O].getHtmlNode().css({
5828 boxShadow:
"0 0 0 10px red"});
5829 ReverseList=[this.getNodesByLoc()[O]].concat(ReverseList)
5832 ListMoveNodes=ListMoveNodes.concat(ReverseList)
5837 if ( columnDrag > columnDrop ) {
5840 for(O in this.getNodesByLoc()) {
5841 if (nX[O] == columnDrop && (nY[O] > lineDrag) && !(lineDrop < nY[O]) ) {
5842 this.getNodesByLoc()[O].getHtmlNode().css({
5843 boxShadow:
"0 0 0 10px blue"});
5844 ReverseList=[this.getNodesByLoc()[O]].concat(ReverseList)
5849 for(O in this.getNodesByLoc()) {
5850 if ( !(nX[O] < columnDrop) && nY[O] == lineDrag && !(nX[O] > columnDrag) ) {
5851 this.getNodesByLoc()[O].getHtmlNode().css({
5852 boxShadow:
"0 0 0 10px red"});
5853 ListMoveNodes.push(this.getNodesByLoc()[O])
5856 ListMoveNodes=ReverseList.concat(ListMoveNodes)
5863 for(O in this.getNodesByLoc()) {
5864 if (nX[O] == columnDrop && (nY[O] > lineDrag) && !(lineDrop < nY[O]) ) {
5865 this.getNodesByLoc()[O].getHtmlNode().css({
5866 boxShadow:
"0 0 0 10px blue"});
5867 ReverseList=[this.getNodesByLoc()[O]].concat(ReverseList)
5873 for(O in this.getNodesByLoc()) {
5874 if ( !(nX[O] < columnDrag) && nY[O] == lineDrag && !(nX[O] > columnDrop) ) {
5875 this.getNodesByLoc()[O].getHtmlNode().css({
5876 boxShadow:
"0 0 0 10px blue"});
5877 ReverseList2=[this.getNodesByLoc()[O]].concat(ReverseList2)
5881 ListMoveNodes=ReverseList.concat(ReverseList2)
5886 for(NodeM=ListMoveNodes.length-1; NodeM > 0;NodeM--) {
5888 node1.setIsMoving(
true);
5889 this.switchLocation(node1,ListMoveNodes[NodeM-1],configBehaviour.showAnimationsLineColSwap,
true);
5890 ListMoveNodes[NodeM-1].getHtmlNode().css({
5893 node1.getHtmlNode().css({
5895 node1.updateSelectedStatus(
false);
5908 addSelectedNode =
function(node){
5909 selectedNodes.push(node);
5913 removeSelectedNode =
function(node){
5914 selectedNodes.splice(selectedNodes.indexOf(node),1);
5918 this.getSelectedNodes =
function(){
5919 return selectedNodes;
5925 addNodeToToggle =
function(node){
5926 nodesToToggle.push(node);
5930 removeNodeToToggle =
function(node){
5931 nodesToToggle.splice(nodesToToggle.indexOf(node),1);
5935 this.getNodesToToggle =
function(){
5936 return nodesToToggle;
5942 this.getBorderSize =
function(){
5949 me.computeNumColumns();
5952 nodesById = (
function(){
5958 for(i=0;i<nodeCardinal;i++) {
5959 temp =
new Location();
5960 node =
new Tile(
this);
5961 nodes_[
"node"+node.getId()]=node;
5962 nodesByLoc[node.getIdLocation()]=node;
5964 globalTagsList.sort();
5973 this.savePositions =
function(boolBlockMove){
5974 boolBlockMove = boolBlockMove ||
false;
5977 while(stepBack > 1) {
5979 nodesOldPositions.pop();
5983 var indice = nodesOldPositions.length;
5985 nodesOldPositions[indice] =
new Array();
5989 for(u=0;u<nodesByLoc.length;u++) {
5990 nodesOldPositions[indice][u]=nodesByLoc[u].getId();
5992 nodesOldPositions[indice].push(boolBlockMove);
6004 this.hasTag =
function(node,word){
6006 if(node.getJsonData().comment.search(word)>-1 || node.getNodeTagList().indexOf(word)>-1)
6018 this.hasFloatingTag =
function(node,word){
6019 return node.getFloatingTag().hasOwnProperty(word)
6023 this.changeNodeSize =
function(){
6025 var X_ = (parseInt($(
"body").prop(
"scrollWidth")))/(maxNumOfColumns);
6027 ratio = spread.X/((parseInt($(
"body").prop(
"scrollWidth"))-(maxNumOfColumns-1)*gapBetweenColumns- X_)/maxNumOfColumns);
6029 me.computeNumColumns();
6041 putOnTop =
function(nodeId){
6043 for ( O in nodesById) {
6044 if(!(nodesById[O].getId()==nodeId)) {
6045 putDown(nodesById[O].getId());
6047 $(
"#"+nodesById[O].getId()).css(
"z-index",100);
6052 putDown =
function(nodeId){
6053 if($(
'#'+nodeId).attr(
"class").match(
"transparentNode")) {
6055 $(
"#"+nodeId).css(
"z-index",100);
6057 $(
"#"+nodeId).css(
"z-index",3);
6062 this.loadContent = (
function(){
6067 return function (nodeId) {
6068 var node = nodesById[
"node"+nodeId];
6069 var hnode=node.getHtmlNode();
6071 if ($(
"#iframe"+nodeId).length == 0) {
6072 hnode.append(
'<iframe id=iframe'+node.getId()+
' scrolling = "yes" src="" frameborder=0 height = "'+
6073 hnode[0].clientHeight +
'px" width = "' + hnode[0].clientWidth +
'px" style="display=none"></iframe>');
6080 var
id=node.getId();
6081 var iframe = $(
'#iframe'+
id);
6082 iframe.onload =
function(){
6083 widthtab[id] = this.width;
6084 heighttab[id] = this.height;
6085 mesh.setWidthTab(
id,this.width);
6086 mesh.setHeightTab(
id,this.height);
6088 if(maxH<heighttab[
id] || maxW<widthtab[
id]){
6090 if(maxH<heighttab[
id])
6091 maxH = heighttab[id];
6093 if(maxW<widthtab[
id])
6094 maxW = widthtab[id];
6096 iframe.height(heighttab[
id]).width(widthtab[
id]).css(zIndex,101 );
6098 if(ColumnStyle==
"static"){
6099 var W = (parseInt($(
"body").prop(
"scrollWidth")))/(maxNumOfColumns);
6100 ratio = maxW/((parseInt($(
"body").prop(
"scrollWidth"))-(maxNumOfColumns-1)*gapBetweenColumns- W)/maxNumOfColumns);
6106 iframe.height(heighttab[
id]).width(widthtab[
id]) ;
6107 mesh.changeNodeSize();
6125 this.loadHitbox = (
function(){
6126 return function(nodeId) {
6128 var HB = $(
'#hitbox'+nodeId);
6135 position:
'absolute',
6141 var SetOff =
function(id) {
6143 var OOF = $(
'#onoff'+
id);
6144 var node2= nodesById[
"node"+id];
6145 OOF.css(
'background-color',
"red");
6146 node.children(
"iframe").hide();
6147 node2.setLoadedStatus(
false);
6150 var SetOn =
function(id) {
6152 var OOF = $(
'#onoff'+
id);
6153 var node2= nodesById[
"node"+id];
6154 OOF.css(
'background-color',
"green");
6155 node2.setLoadedStatus(
true);
6156 mesh.loadContent(
id);
6157 node.children(
"iframe").show();
6163 this.startLoading =
function() {
6167 var waypoint =
new Array();
6170 if(configBehaviour.showInfoAtLoading) {
6171 for (O in nodesByLoc)
6172 if (nodesByLoc[O].getNodeInViewportStatus())
6173 nodesByLoc[O].getHtmlNode().children(
".info").css({visibility :
"visible"});
6174 $(
".showInfoButtonIcon").removeClass(
'showInfoButtonIcon').addClass(
'closeShowInfoButtonIcon');
6177 me.computeNumColumns();
6178 for(O in nodesById){
6180 var
id = O.replace(
"node",
"");
6181 var node = mesh.getNode(
id);
6184 if( node.getLoadedStatus() ==
false &&
6185 node.getNodeInViewportStatus() ) {
6187 ratio=mesh.loadContent(node.getId());
6189 mesh.loadHitbox(node.getId());
6191 else if(node.getLoadedStatus() ==
false) {
6193 var
id = node.getId();
6197 waypoint[id] =
new Waypoint({
6199 offset :
'bottom-in-view' ,
6200 element: document.getElementById(
''+node.getId()),
6202 handler: (
function(){
6204 var
id = node.getId();
6205 return function(direction) {
6207 ratio = mesh.loadContent(
id);
6208 mesh.loadHitbox(
id);
6209 waypoint[id].destroy();
6210 node.setLoadedStatus(
true);
6219 spread = mesh.getSpread();
6220 mesh.updateSpread({X : spread.X/ratio , Y : spread.Y/ratio});
6223 for ( var TS in json_actions) {
6224 for ( var thisAction in json_actions[TS]) {
6225 var FuncName=json_actions[TS][thisAction][0];
6226 var IconName=json_actions[TS][thisAction][1];
6227 var ButtonDiv=$(
".optionfromactionGlobal").filter(
"."+TS+
"_"+IconName+
"ButtonIcon")
6228 if (ButtonDiv.children().length == 0) {
6229 ButtonDiv.append(
'<i class="material-icons" style="position:relative; top:100px; color:'+
6230 $(
'.'+TS).css(
"background-color")+
'; -moz-transform:scale(8);-webkit-transform:scale(8)">'+
6238 this.meshEventStart =
function(){
6243 click : me.clickQRcode
6246 _allowDragAndDrop =
true;
6247 touchspeed = configBehaviour.touchSpeed;
6249 this.meshEventReStart =
function(){
6250 setTimeout(
function() {
6252 htmlPrimaryParent.off();
6254 for (O in nodesByLoc) {
6255 if (nodesByLoc[O].getNodeInViewportStatus()) {
6256 nodesByLoc[O].sub(
'qrcode').off();
6257 nodesByLoc[O].sub(
'handle').off();
6258 nodesByLoc[O].sub(
'rotate').off();
6260 nodesByLoc[O].sub(
'hitbox').off();
6261 nodesByLoc[O].sub(
'onoff').off();
6262 nodesByLoc[O].sub(
'').off();
6265 _allowDragAndDrop =
true;
6268 htmlPrimaryParent.on(touchhandleEvent);
6270 for (O in nodesByLoc) {
6271 if (nodesByLoc[O].getNodeInViewportStatus()) {
6272 nodesByLoc[O].sub(
'onoff').on(OOFEvent);
6273 nodesByLoc[O].sub(
'handle').on(handleEvent);
6274 nodesByLoc[O].sub(
'rotate').on(rotateEvent);
6275 nodesByLoc[O].sub(
'hitbox').on(HBEvent);
6276 nodesByLoc[O].sub(
'').on(NodeEvent);
6277 nodesByLoc[O].setLoadedStatus(
true);
6279 nodesByLoc[O].sub(
'qrcode').on({
6287 this.setDraggable =
function(targetNode_, boolBorder, boolTransparent){
6289 if (! $(
'#' + targetNode_).hasClass(
"ui-draggable")) {
6291 $(
'#'+targetNode_).css(
"z-index", 999);
6292 $(
'#handle'+targetNode_).addClass(
"drag-handle-dragging");
6293 if (boolTransparent) {
6294 console.log(
"set draggable transp ", boolTransparent);
6295 }
else if(boolBorder) {
6296 console.log(
"set draggable border ", boolBorder);
6297 $(
'#' + targetNode_).children(
"iframe").hide();
6298 $(
'#' + targetNode_).css(
"background-color",
"transparent");
6299 $(
'#' + targetNode_).css(
"border",
"10px solid white");
6301 putOnTop(targetNode_);
6302 $(
'#'+targetNode_).draggable();
6303 $(
'#' + targetNode_).off(
"mouseleave");
6304 if (parseBool(configBehaviour.moveOnGrid)) {
6305 $(
'#' + targetNode_).draggable(
"option",
"grid", [spread.X + gapBetweenColumns, spread.Y + configBehaviour.gapBetweenLines]);
6307 $(
'#' + targetNode_).off(
"mouseup").on(
"mouseup",
function(e){
6309 me.dropNode(targetNode_);
6310 refreshNodes(targetNode_);
6311 me.globalLocationProvider();
6319 this.unsetDraggable =
function(targetNode_, boolBorder, boolTransparent){
6321 boolBorder = boolBorder || configBehaviour.moveOnlyABorder;
6324 boolTransparent = boolTransparent || $(
'#'+targetNode_).attr(
"class").match(
"transparentNode");
6326 if($(
'#' + targetNode_).hasClass(
"ui-draggable")) {
6327 $(
'#' + targetNode_).draggable(
"destroy");
6332 if (boolTransparent) {
6333 $(
'#'+targetNode_).css(
"z-index", 899);
6336 $(
'#'+targetNode_).css(
"z-index", 3);
6339 if (nodesByLoc[targetNode_].getLoadedStatus()) {
6340 $(
'#' + targetNode_).css(
"background-color",
"white");
6341 $(
'#' + targetNode_).css(
"border-display",
"none");
6342 me.loadContent(targetNode_);
6347 $(
'#handle'+targetNode_).removeClass(
"drag-handle-dragging");
6353 this.dropNode =
function(targetNode_){
6354 var node = me.getNode(targetNode_);
6356 node.updateLocFromHtmlNode();
6357 var nodeX = node.getLocation().getX();
6358 var nodeY = node.getLocation().getY();
6359 me.RealdropNode(targetNode_, nodeX, nodeY);
6360 $(
'#'+targetNode_).addClass(
"NotSharedAgain");
6361 cdata={
"room":my_session,
"id":targetNode_,
"posX":nodeX ,
"posY":nodeY };
6362 socket.emit(
"move_tile", cdata, callback=
function(sdata){
6367 this.RealdropNode =
function(targetNode_, newPosX, newPosY){
6368 var node = me.getNode(targetNode_);
6370 node.updateLocFromHtmlNode();
6371 var nodeX = newPosX;
6372 var nodeY = newPosY;
6376 for(i = 0 ; i < nodeCardinal ; i++) {
6377 if(i != node.getId()) {
6378 var tmpNodeLoc = nodesById[
"node" + i].getLocation();
6379 var tmpNodeX = tmpNodeLoc.getX();
6380 var tmpNodeY = tmpNodeLoc.getY();
6381 var v = nodeX - tmpNodeX;
6382 var w = nodeY - tmpNodeY;
6384 if((v>-spread.X/targetSize && w>-spread.Y/targetSize) && (v<spread.X/targetSize && w<spread.Y/targetSize)) {
6386 if($(
'#'+node.getId()).hasClass(
"transparentNode")) {
6387 me.setLocation(node,tmpNodeLoc);
6391 me.switchLocationShiftColumnLine(node,nodesById[
"node"+i],
true,
true);
6393 node.updateSelectedStatus(
false);
6400 if (allocate ==
false) {
6401 me.setLocation(node,node.getIdLocation(),
false,50);
6406 socket.on(
'receive_move',
function(sdata){
6409 var newPosX = sdata[
"posX"];
6410 var newPosY = sdata[
"posY"];
6411 var tileID = parseInt(sdata[
"id"]);
6413 if ( ! $(
'#'+tileID).hasClass(
"NotSharedAgain") )
6414 me.RealdropNode(tileID, newPosX, newPosY);
6416 $(
'#'+tileID).removeClass(
"NotSharedAgain");
6420 var dragAndDrop =
function(targetNode_){
6424 if (!_allowDragAndDrop) {
6425 $(
'node').filter(
'.ui-draggable').draggable(
"destroy");
6429 var targetNode = targetNode_;
6430 var node = mesh.getNode(targetNode);
6431 var _isNodeTransparent = ($(
'#' + targetNode).hasClass(
"transparentNode") ==
true);
6432 mesh.setDraggable(targetNode, configBehaviour.moveOnlyABorder, _isNodeTransparent);
6437 var groupTags =
function(pattern_) {
6438 var Nodes = nodesByLoc;
6439 var NodesByLoc = nodesByLoc;
6443 if (mesh.hasTag(Nodes[O], pattern_)) {
6444 mesh.switchLocation(Nodes[O], NodesByLoc[w],
false,
true)
6450 var mouseEnterFunction =
function () {
6452 var node = mesh.getNode(this.
id);
6453 node.updateHtmlNodeState(1);
6454 if ($(
'node').filter(
'.ui-draggable').length == 0) {
6455 putOnTop(node.getId());
6456 var HB=$(
'#hitbox'+node.getId());
6457 var HBcolor = HB.css(
'background-color');
6458 if(HBcolor != colorHBselectedRGB && HBcolor != colorHBtoZoomRGB) {
6459 HB.css(
"background-color", colorHBonfocus);
6462 if (_allowDragAndDrop) {
6471 var mouseLeaveFunction =
function () {
6473 for (O in nodesByLoc)
6474 if (nodesByLoc[O].getNodeInViewportStatus()) {
6475 nodesByLoc[O].sub(
'').off(
"mouseup");
6477 var node = mesh.getNode(this.
id);
6478 var HBcolor = $(
'#hitbox'+node.getId()).css(
'background-color');
6479 if(HBcolor != colorHBselectedRGB && HBcolor != colorHBtoZoomRGB) {
6480 $(
'#hitbox'+node.getId()).css(
'background-color', colorHBdefault);
6484 if(node.getState()==3) {
6485 node.draggable(
"destroy")
6486 mesh.loadContent(this.
id);
6489 node.updateHtmlNodeState(0);
6490 putDown(node.getId());
6496 var clickFunction =
function () {
6499 var node = mesh.getNode(this.
id);
6500 if (node.getState() == 0) {
6501 for (O in nodesByLoc)
6502 if (nodesByLoc[O].getNodeInViewportStatus()) {
6503 nodesByLoc[O].sub(
'').off(
"mouseup");
6505 node.updateHtmlNodeState(1);
6507 if ($(
'.transparentNode').length==0) {
6509 putOnTop(node.getId());
6528 for (O in nodesByLoc)
6529 if (nodesByLoc[O].getNodeInViewportStatus()) {
6530 nodesByLoc[O].sub(
'').off(
"mouseup");
6532 node.updateHtmlNodeState(0);
6533 putDown(node.getId());
6539 var dblclickFunction =
function() {
6541 var node = mesh.getNode(this.
id);
6543 if(node.getSelectedStatus()==
false)
6544 node.updateSelectedStatus(
true);
6546 node.updateSelectedStatus(
false);
6548 if(selectedNodes.length>2) {
6549 selectedNodes[0].updateSelectedStatus(
false);
6551 else if (selectedNodes.length == 2) {
6552 me.switchLocationShiftColumnLine(selectedNodes[0],selectedNodes[1],
true,
true)
6554 selectedNodes[0].updateSelectedStatus(
false);
6563 mouseenter: mouseEnterFunction ,
6565 mouseleave: mouseLeaveFunction,
6567 click: clickFunction,
6569 dblclick: dblclickFunction
6573 $(
'.node').on(NodeEvent);
6575 var clickOnOff =
function(){
6576 if (emit_click(
"onoff",this.
id))
6578 var
id = this.
id.replace(
"onoff",
"");
6579 var node = nodesById[
"node"+id];
6580 if( node.getOnOffStatus() ) {
6591 $(
'.onoff').on(OOFEvent);
6593 clickHB =
function(){
6595 if((me.getZoomSelection() ==
false) && (currentSelectedTag ==
"")) {
6596 var HB = $(
'#'+this.
id);
6598 var
id = this.
id.replace(
"hitbox",
"");
6599 var HBcolor = HB.css(
'background-color');
6600 if(HBcolor == colorHBselectedRGB) {
6601 HB.css({backgroundColor : colorHBonfocus});
6603 HB.css({backgroundColor : colorHBselected});
6605 if(me.getNodesToToggle().length == 0) {
6606 addNodeToToggle(
id);
6608 else if(me.getNodesToToggle().length == 1) {
6609 var nodesToToggle = me.getNodesToToggle();
6610 if(
id!=nodesToToggle[0]) {
6611 addNodeToToggle(
id);
6612 var node1 = me.getNode(nodesToToggle[0]);
6613 var node2 = me.getNode(nodesToToggle[1]);
6614 me.switchLocationShiftColumnLine(node1,node2,
true,
true);
6615 $(
'#hitbox'+nodesToToggle[0]).css(
'background-color', colorHBdefault);
6616 $(
'#hitbox'+nodesToToggle[1]).css(
'background-color', colorHBdefault);
6617 nodesToToggle.splice(0,2);
6618 nodesToToggle.splice(0,2);
6620 console.log(
"This node is already stored");
6623 console.log(
"Problem with nodesToToggle, its length shouldn’t exceed 2 !");
6626 else if (me.getZoomSelection() ==
true) {
6627 console.log(
"Select Zoom with hitbox.");
6628 clickHBSelect(
id=this.
id);
6630 else if (currentSelectedTag !=
"") {
6631 console.log(
"Add Tag with hitbox.");
6632 clickHBTag(
id=this.
id);
6639 nodeSelect =
function(node,HB) {
6640 if(node.getSelectedStatus()==
false) {
6641 node.updateSelectedStatus(
true);
6642 me.addNodeToZoom(node);
6643 HB.css({backgroundColor : colorHBtoZoom});
6645 node.updateSelectedStatus(
false);
6646 me.removeNodeToZoom(node);
6647 HB.css({backgroundColor : colorHBdefault});
6651 clickHBSelect =
function(id__){
6652 if (typeof this.
id ==
'undefined')
6657 var HB = $(
'#' + id_);
6659 var
id = id_.replace(
"hitbox",
"");
6661 var node = me.getNode(
id);
6664 console.log(
"Error in clickHBSelect.");
6668 clickHBTag =
function(id__){
6669 if (typeof this.
id ==
'undefined')
6674 if (emit_click(
"hitbox",id_))
6676 var HB = $(
'#' + id_);
6677 if(currentSelectedTag !=
"") {
6678 var
id = id_.replace(
"hitbox",
"");
6679 var node = me.getNode(
id);
6680 node.getStickers().addSticker(currentSelectedTag, attributedTagsColorsArray[currentSelectedTag],
true);
6681 addBorderBlink($(
"#iframe"+
id),attributedTagsColorsArray[currentSelectedTag])
6682 node.addElementToNodeTagList(currentSelectedTag);
6683 $(
'.sticker').off();
6685 click : clickSticker
6687 $(
'#tag-notif').text(
"Added tag " + currentSelectedTag +
" to tile " +
id);
6689 $(
'#tag-notif').text(
"No tag currently selected, you may need to click on a tag in the legend to select it, or to create a new one?");
6702 $(
'.hitbox').on(HBEvent);
6704 var mouseEnterHandle =
function(e){
6705 if ($(
"#" + this.
id).ontouchstart == undefined) {
6706 $(
"#" + this.
id).off(
"mouseleave");
6707 $(
"#" + this.
id).off(
"mouseup");
6709 if($(
'#' + this.
id).hasClass(
"drag-handle-on")) {
6710 for (O in nodesByLoc)
6711 if (nodesByLoc[O].getNodeInViewportStatus()) {
6712 nodesByLoc[O].sub(
'').off(
"mouseenter");
6714 $(
'#'+this.
id).css(
'-webkit-transform',
'scale(2)').css(
'-moz-transform',
'scale(2)');
6715 var nodeToDrag = this.
id.replace(
"handle",
"");
6716 if(_allowDragAndDrop && $(
'.node').filter(
'.ui-draggable').length == 0) {
6719 $(
"#" + this.
id).on(
"mousedown",
function(e){
6720 dragAndDrop(nodeToDrag);
6724 $(
"#" + this.
id).on(
"mouseup",
function(e){
6725 var nodeToDrop = this.
id.replace(
"handle",
"");
6726 me.dropNode(nodeToDrop);
6727 $(
'#'+this.
id).css(
'-webkit-transform',
'scale(1)').css(
'-moz-transform',
'scale(1)');
6728 refreshNodes(nodeToDrop);
6729 me.globalLocationProvider();
6730 me.meshEventReStart();
6732 $(
"#" + this.
id).on(
"mouseleave",
function(e){
6733 var nodeToDrop = this.
id.replace(
"handle",
"");
6734 refreshNodes(nodeToDrop);
6735 me.meshEventReStart();
6736 $(
'#'+nodeToDrag).on(NodeEvent);
6738 $(
"#" + this.
id).off(
"mousedown");
6739 $(
"#" + this.
id).on(
"mousedown",
function(e){
6740 $(
'#'+nodeToDrag).on(NodeEvent);
6741 $(
"#" + this.
id).mouseenter();
6743 $(
'#'+nodeToDrag).on(NodeEvent);
6744 }).on(
"mouseleave",
function(e){
6745 $(
'#'+this.
id).css(
'-webkit-transform',
'scale(1)').css(
'-moz-transform',
'scale(1)');
6748 if ($(
'.node').filter(
'.ui-draggable').length == 0)
6749 for (O in nodesByLoc)
6750 if (nodesByLoc[O].getNodeInViewportStatus()) {
6751 nodesByLoc[O].sub(
'').on(
"mousenter");
6758 mouseenter: mouseEnterHandle,
6761 console.log(
"No Touch.");
6763 $(
'.handle').on(handleEvent);
6765 var mouseEnterRotate =
function(e){
6766 if ($(
"#" + this.
id).ontouchstart == undefined) {
6767 var RotateBut=$(
"#" + this.
id);
6768 RotateBut.off(
"mousedown");
6769 RotateBut.off(
"mouseup");
6770 RotateBut.off(
"mousemove");
6771 RotateBut.off(
"mouseleave");
6772 RotateBut.off(
"mouseenter");
6773 RotateBut.off(
"dblclick");
6775 var
id = this.
id.replace(
"rotate",
"");
6777 var node = mesh.getNode(
id);
6778 var nodeToRotate=$(
'#' +
id);
6780 var rotstate_angle = 0.;
6783 RotateBut.on(
"mousedown",
function(e){
6785 RotateBut.css(
'-webkit-transform',
'scale(2)').css(
'-moz-transform',
'scale(2)');
6788 RotateBut.on(
"mousemove",
function(e){
6791 rotstate_angle = node.getNodeAngle();
6792 if (!! configBehaviour.smoothRotation) {
6793 if ( rotstate_angle > 340 || rotstate_angle < 20)
6795 else if ( rotstate_angle > 70 && rotstate_angle < 110)
6797 else if ( rotstate_angle > 160 && rotstate_angle < 200)
6799 else if ( rotstate_angle > 250 && rotstate_angle < 290)
6802 rotstate_angle = rotstate_angle+RotInc;
6803 if (rotstate_angle > 360)
6804 rotstate_angle=RotInc;
6806 node.setNodeAngle(rotstate_angle);
6808 nodeToRotate.css({
'-webkit-transform':
'rotate('+rotstate_angle+
'deg)',
6809 '-moz-transform':
'rotate('+rotstate_angle+
'deg)',
6810 '-o-transform':
'rotate('+rotstate_angle+
'deg)',
6811 '-ms-transform':
'rotate('+rotstate_angle+
'deg)',
6812 'transform':
'rotate('+rotstate_angle+
'deg)'
6814 e.stopPropagation();
6816 }).on(
"mouseup",
function(e){
6820 RotateBut.off(
"mousemove");
6821 RotateBut.off(
"mouseleave");
6822 RotateBut.off(
"mouseup");
6824 RotateBut.on(
"mouseleave",
function(e){
6826 RotateBut.css(
'-webkit-transform',
'scale(0.5)').css(
'-moz-transform',
'scale(0.5)');
6827 e.stopPropagation();
6829 e.stopPropagation();
6830 RotateBut.on(
"mouseenter",mouseEnterRotate)
6832 }).on(
"dblclick",
function(e){
6833 node.setNodeAngle(0);
6835 nodeToRotate.css({
'-webkit-transform':
'rotate('+0+
'deg)',
6836 '-moz-transform':
'rotate('+0+
'deg)',
6837 '-o-transform':
'rotate('+0+
'deg)',
6838 '-ms-transform':
'rotate('+0+
'deg)',
6839 'transform':
'rotate('+0+
'deg)'
6841 e.stopPropagation();
6847 mouseenter: mouseEnterRotate,
6849 $(
'.rotate').on(rotateEvent);
6853 var dragging =
new Map();
6854 var rotating =
new Map();
6859 $(
'.node').on(
"mouseleave");
6860 $(
'.node').on(
"mouseup");
6862 var touchstartHandle =
function (ev) {
6865 var hastouched=
false;
6867 for (var i = 0; i < ev.changedTouches.length; i++) {
6868 var touch = ev.changedTouches[i];
6869 var targetid=touch.target.id;
6870 if (targetid.indexOf(
'handle') >= 0 && _allowDragAndDrop ) {
6872 var
id = targetid.replace(
"handle",
"");
6874 var nodeToDrag=$(
'#' +
id);
6875 var thishandle=$(
'#'+touch.target.id);
6876 thishandle.addClass(
"drag-handle-dragging");
6878 for (O in nodesByLoc)
6879 if (nodesByLoc[O].getNodeInViewportStatus()) {
6880 nodesByLoc[O].sub(
'').off(
"mouseenter");
6882 nodeToDrag.off(
"mouseleave");
6885 top: parseInt(nodeToDrag[0].style.top.replace(
'px',
'')),
6886 left: parseInt(nodeToDrag[0].style.left.replace(
'px',
'')),
6889 dragging.set(touch.identifier, {
6890 target: touch.target,
6904 $(
'#'+targetid).css(
'-webkit-transform',
'scale(2)').css(
'-moz-transform',
'scale(2)');
6905 }
else if (targetid.indexOf(
'rotate') >= 0) {
6906 var
id = targetid.replace(
"rotate",
"");
6907 var nodeToDrag=$(
'#' +
id);
6908 var node = mesh.getNode(
id);
6909 var centerX = nodeToDrag[0].style.left.replace(
'px',
'')+(nodeToDrag[0].style.width.replace(
'px',
'')/2);
6910 var centerY = nodeToDrag[0].style.top.replace(
'px',
'')+(nodeToDrag[0].style.height.replace(
'px',
'')/2);
6911 rotating.set(touch.identifier, {
6912 target: touch.target,
6913 angle: node.getNodeAngle(),
6918 console.log(
"centerX : "+centerX+
" centerY : "+centerY);
6919 $(
'#'+targetid).css(
'-webkit-transform',
'scale(2)').css(
'-moz-transform',
'scale(2)');
6928 var touchmoveHandle =
function (ev) {
6929 for (var i = 0; i < ev.changedTouches.length; i++) {
6931 var touch = ev.changedTouches[i];
6932 var targetid=touch.target.id;
6933 var dragstate = dragging.get(touch.identifier);
6934 var rotstate = rotating.get(touch.identifier);
6938 if (targetid.indexOf(
'handle') >= 0 && _allowDragAndDrop && dragstate) {
6939 var
id = targetid.replace(
"handle",
"");
6940 var node = mesh.getNode(
id);
6941 var nodeToDrag=$(
'#' +
id);
6942 var thishandle=$(
'#'+touch.target.id);
6943 dragstate.left = parseInt(dragstate.left)+touchspeed*(touch.pageX - dragstate.prevX);
6944 dragstate.top = parseInt(dragstate.top)+touchspeed*(touch.pageY - dragstate.prevY);
6945 nodeToDrag.css({left: dragstate.left+
'px',
6946 top: dragstate.top+
'px'});
6954 dragstate.prevX = touch.pageX;
6955 dragstate.prevY = touch.pageY;
6961 ev.stopPropagation();
6963 else if (targetid.indexOf(
'rotate') >= 0 && rotstate && configBehaviour.smoothRotation) {
6964 var
id = targetid.replace(
"rotate",
"");
6965 var node = mesh.getNode(
id);
6966 var nodeToDrag=$(
'#' +
id);
6967 var thishandle=$(
'#'+touch.target.id);
6969 rotstate.angle = rotstate.angle+RotInc;
6970 if (rotstate.angle > 360)
6971 rotstate.angle=RotInc;
6973 console.log(
id+
" move rotstate.angle : "+rotstate.angle);
6974 node.setNodeAngle(rotstate.angle);
6976 nodeToDrag.css({
'-webkit-transform':
'rotate('+rotstate.angle+
'deg)',
6977 '-moz-transform':
'rotate('+rotstate.angle+
'deg)',
6978 '-o-transform':
'rotate('+rotstate.angle+
'deg)',
6979 '-ms-transform':
'rotate('+rotstate.angle+
'deg)',
6980 'transform':
'rotate('+rotstate.angle+
'deg)'
6990 var touchendHandle =
function (ev) {
6992 var hastouched=
false;
6994 for (var i = 0; i < ev.changedTouches.length; i++) {
6995 var touch = ev.changedTouches[i];
6996 var dragstate = dragging.get(touch.identifier);
6997 var rotstate = rotating.get(touch.identifier);
6998 var targetid=touch.target.id;
6999 if (targetid.indexOf(
'handle') >= 0 && _allowDragAndDrop && dragstate) {
7000 var thishandle=$(
'#'+touch.target.id);
7001 var
id = targetid.replace(
"handle",
"");
7002 var nodeToDrag=$(
'#' +
id);
7009 me.globalLocationProvider();
7014 dragging.delete(touch.identifier);
7016 $(thishandle).removeClass(
"drag-handle-dragging");
7020 nodeToDrag.on(
"mouseleave");
7021 if (dragging.size == 0)
7022 for (O in nodesByLoc)
7023 if (nodesByLoc[O].getNodeInViewportStatus()) {
7024 nodesByLoc[O].sub(
'').on(
"mouseenter");
7027 $(
'#'+targetid).css(
'-webkit-transform',
'scale(1)').css(
'-moz-transform',
'scale(1)');
7028 }
else if (targetid.indexOf(
'rotate') >= 0 && rotstate) {
7029 var
id = targetid.replace(
"rotate",
"");
7030 var node = mesh.getNode(
id);
7031 var nodeToDrag=$(
'#' +
id);
7033 if (!! configBehaviour.smoothRotation) {
7034 if ( rotstate.angle > 340 || rotstate.angle < 20)
7036 else if ( rotstate.angle > 70 && rotstate.angle < 110)
7038 else if ( rotstate.angle > 160 && rotstate.angle < 200)
7040 else if ( rotstate.angle > 250 && rotstate.angle < 290)
7043 rotstate.angle = rotstate.angle+RotInc;
7044 if (rotstate.angle > 360)
7045 rotstate.angle=RotInc;
7048 console.log(
id+
" end rotstate.angle : "+rotstate.angle);
7049 node.setNodeAngle(rotstate.angle);
7051 nodeToDrag.css({
'-webkit-transform':
'rotate('+rotstate.angle+
'deg)',
7052 '-moz-transform':
'rotate('+rotstate.angle+
'deg)',
7053 '-o-transform':
'rotate('+rotstate.angle+
'deg)',
7054 '-ms-transform':
'rotate('+rotstate.angle+
'deg)',
7055 'transform':
'rotate('+rotstate.angle+
'deg)'
7067 rotating.delete(touch.identifier);
7068 $(
'#'+targetid).css(
'-webkit-transform',
'scale(1)').css(
'-moz-transform',
'scale(1)');
7072 me.meshEventReStart();
7079 var touchhandleEvent = {
7080 touchstart: touchstartHandle,
7081 touchmove: touchmoveHandle,
7082 touchend: touchendHandle,
7085 htmlPrimaryParent.on(touchhandleEvent);
7089 this.clickzoomNode =
function(){
7091 if ( configBehaviour.sharedZoomNodes && emit_click(
"zoomNodeButtonIcon",this.
id))
7095 var
id = this.
id.replace(
"zoomNode",
"");
7097 var node = me.getNode(
id);
7100 var nodeZoomTab =
new Array();
7101 nodeZoomTab.push(node);
7102 var ratio =spread.Y/spread.X;
7103 var initSpread = spread;
7105 for (O in nodesByLoc)
7106 if (nodesByLoc[O].getNodeInViewportStatus()) {
7107 nodesByLoc[O].sub(
'').off();
7108 nodesByLoc[O].sub(
'hitbox').off(
"click").on(
"click", clickHBSelect);
7109 nodesByLoc[O].sub(
'hitbox').off(
"mouseenter");
7111 _allowDragAndDrop =
false;
7113 me.magnifyingGlass(nodeZoomTab,ratio,initSpread);
7114 if ( configBehaviour.sharedZoomNodes )
7115 $(
'#buttonUnzoom').on(
'click',
function(){ emit_click(
"unzoomButtonIcon",
"buttonUnzoom") } )
7118 this.init_click_zoomNode =
function() {
7119 $(
'.zoomNodeButtonIcon').on({
7120 click : me.clickzoomNode
7125 clickQRcode =
function(){
7127 if (emit_click(
"qrcode",this.
id))
7129 var splittedId = this.
id.split(
"qrcode");
7130 var nodeId = splittedId.pop();
7131 var divnode = $(
'#'+nodeId);
7132 var node = nodesById[
"node"+nodeId];
7133 var theqrcode = node.getQRcode();
7134 var thisqrcode = $(
'#qrcode'+nodeId);
7135 var qrcodeZoom=theqrcode.getZoom();
7139 position :
"absolute",
7140 top : parseInt(divnode.css(
"height"))-50,
7141 left : parseInt(divnode.css(
"width"))-50,
7146 thisqrcode.css(
'-webkit-transform',
'scale('+1.+
')').css(
'-moz-transform',
'scale('+1.+
')');
7147 $(
'#qqrcode'+nodeId).css({
7150 theqrcode.setZoom(
false);
7152 thisqrcode.css(
'-webkit-transform',
'scale('+400./130+
')').css(
'-moz-transform',
'scale('+400./130+
')');
7154 position :
"absolute",
7155 top : parseInt(divnode.css(
"height"))-200,
7156 left : parseInt(divnode.css(
"width"))-200,
7159 $(
'#qqrcode'+nodeId).css({
7162 theqrcode.setZoom(
true);
7164 $(
'#iqrcode'+nodeId).css({
7165 width : thisqrcode.css(
"width"),
7166 height : thisqrcode.css(
"height"),
7168 $(
'#qqrcode'+nodeId).css({
7169 top : -parseInt(thisqrcode.css(
"height"))*1.1,
7170 width : parseInt(thisqrcode.css(
"width")),
7171 height : parseInt(thisqrcode.css(
"height")),
7176 $( window ).resize(
function() {
7178 if(ColumnStyle==
"static") {
7179 mesh.changeNodeSize();
7181 else if(ColumnStyle==
"dynamic" && numOfColumns==maxNumOfColumns) {
7182 me.computeNumColumns();
7183 mesh.globalLocationProvider();
7184 mesh.changeNodeSize();
7186 me.computeNumColumns();
7187 mesh.globalLocationProvider();