2$(document).off(
'touchstart');
3$(document).off(
'touchmove');
4$(document).off(
'touchend');
5$(window).off(
'touchstart');
6$(window).off(
'touchmove');
7$(window).off(
'touchend');
8$(window).off(
"contextmenu");
9$(document.body).off(
'touchmove');
10$(window).css(
"touch-action",
"none");
12$(document).ready(
function(){
13 $(window).on(
'touchmove',
function(e)
18 socket = io.connect(
'https://' + document.domain);
21 console.log(
"my session is :", my_session);
22 socket.on(
"connect",
function(){
23 var cdata = {
"user": my_user,
"project" : my_project,
"session": my_session };
24 socket.emit(
"connected_grid",
28 console.log(
"Socket connection running: ID:" + sdata[
"session_id"]+
", room: "+
34 $(
"#notifications").html(
"Here is the grid. You can get help with '?' button.")
36 socket.on(
"disconnect", (reason) => {
37 if (reason ===
"io server disconnect") {
39 console.log(
"The server has forcefully disconnected the socket");
42 }
else if (reason ===
"io client disconnect") {
43 console.log(
"The socket was manually disconnected.");
44 }
else if (reason ===
"ping timeout") {
45 console.log(
"The server did not send a PING within the pingInterval + pingTimeout range.");
46 }
else if (reason ===
"transport close") {
47 console.log(
"The connection was closed.");
48 }
else if (reason ===
"transport error") {
49 console.log(
"The connection has encountered an error.");
53 var update_client_number =
function(new_nbr){
58 else if (new_nbr == 1){
59 new_text =
"only one participant";
62 var tmp_nbr = new_nbr - 1;
63 new_text =
"with " + new_nbr +
" other participants";
65 $(
'#join-clients').text(new_text);
66 console.log(
"Session participants: " + $(
'#join-clients').text());
70 htmlPrimaryParent = $(
'#primaryparent');
71 primaryparent=document.getElementById(
"primaryparent")
75 lang=json_config.language;
76 console.log(lang==
"FR" ?
"FR selected" :
"EN selected" );
77 htmlPrimaryParent.off(
'mouseleave');
78 htmlPrimaryParent.off(
'mouseenter');
79 htmlPrimaryParent.off(
'mousedown');
80 htmlPrimaryParent.off(
'mouseup');
81 htmlPrimaryParent.off(
'touchstart');
82 htmlPrimaryParent.off(
'touchmove');
83 htmlPrimaryParent.off(
'touchend');
86 htmlPrimaryParent.css({
91 htmlPrimaryParent.append(
'<div id=warning class="warning blink"></br></br>'+
92 'Warning, a configuration file is missing! You should have either a <b>config_default.js</b> in the folder TileViz,'+
93 ' or a <b>config.js</b> in the parent repository!</div>');
94 $(
'#header').css(
'height', 0);
95 console.log(
"error catched");
100 width : window.innerWidth,
103 backgroundColor :
"white",
111 TopPP = htmlPrimaryParent.css(
"marginTop");
114 socket.on(
'new_client',
function(sdata){
115 console.log(sdata,
"new client");
116 update_client_number(sdata[
'part_nbr_update'])
117 htmlPrimaryParent.click();
121 console.log(
"my_geometry =",my_geometry);
122 get_newwindowRatio =
function() {
123 if ( my_geometry[
"DISPLAYWIDTH"] === undefined) {
124 var grid_width = parseInt($(
'#main-grid').css(
"width"));
126 var grid_height = window.innerHeight;
128 "right":window.innerWidth,
130 "down":window.innerHeight}
132 displaywidth=parseInt(my_geometry[
"DISPLAYWIDTH"]);
133 displayheight=parseInt(my_geometry[
"DISPLAYHEIGHT"]);
134 shiftleft=parseInt(my_geometry[
"SHIFTLEFT"]);
135 shifttop=parseInt(my_geometry[
"SHIFTTOP"]);
136 var grid_width = parseInt(my_geometry[
"WALLWIDTH"]);
137 var grid_height = parseInt(my_geometry[
"WALLHEIGHT"])
140 padding_left=displaywidth/5;
141 padding_top=displayheight/5;
142 my_window={
"left":-shiftleft-padding_left,
143 "right":-shiftleft+displaywidth+padding_left,
144 "top":-shifttop-padding_top,
145 "down":-shifttop+displayheight+padding_top}
147 console.log(
"Window computed with my_geometry : ",my_window)
150 relativeLeft=parseInt(htmlPrimaryParent.css(
'width'))/2;
152 if ( me.getSpread().X > 3840 )
153 relativeLeft=parseInt(relativeLeft/2);
156 console.log(
"Error : init relativeLeft "+e.toString())
160 let removePixelRatio =
null;
162 const updatePixelRatio = () => {
163 if(removePixelRatio !=
null) {
166 let PixelRatioReq = `(resolution: ${window.devicePixelRatio}dppx)`;
167 let media = matchMedia(PixelRatioReq);
168 media.addListener(updatePixelRatio);
170 get_newwindowRatio();
171 console.log(
"detect new PixelRatio: " + window.devicePixelRatio);
172 removePixelRatio =
function() {media.removeListener(updatePixelRatio)};
200 useJsonDataLocation=configJsonData.useLocation;
208 colorFilterStickersTab = configColors.FilterStickersTab;
209 colorTagStickersTab = configColors.TagStickersTab;
210 attributedTagsColorsArray =
new Array();
212 globalTagsColors ={};
213 globalFloatingTags = {};
214 currentSelectedTag =
"";
215 colorHBdefault = configColors.HBdefault;
216 colorHBonfocus = configColors.HBonfocus;
217 colorHBselected = configColors.HBselected;
218 colorHBtoZoom = configColors.HBtoZoom;
223 htmlPrimaryParent.append(
'<div id=color></div>');
224 $(
'#color').css(
'background-color', colorHBselected);
225 colorHBselectedRGB = $(
'#color').css(
'background-color');
226 $(
'#color').css(
'background-color', colorHBtoZoom);
227 colorHBtoZoomRGB = $(
'#color').css(
'background-color');
228 $(
'#color').remove();
233 $.fn.postitall.globals = {
239 autoHideToolBar :
true,
245 changeoptions :
true,
254 autoPosition :
false,
259 chargeAllContentOnStart = configBehaviour.loadAllContentOnStart;
263 distance_from_the_bottom_for_loading = parseInt(window.outerHeight);
270 mesh_cardinal = jsDataTab.length;
273 bool_fix_number_of_columns = configBehaviour.fixColumnNumber;
275 maximal_number_of_columns = configBehaviour.maxNumOfColumns;
277 gapBetweenColumns = configBehaviour.spaceBetweenColumns;
279 gapBetweenLines = configBehaviour.spaceBetweenLines;
285 targetSize = configBehaviour.targetSize;
289 primaryZoomSlider = configBehaviour.primaryZoomSlider;
292 only_one_option = configBehaviour.onlyOneOption;
295 if ( primaryZoomSlider ) {
296 $(
'#primarySliderLabel').show();
297 $(
'#primarySlider').show();
298 $(
'#primarySlider').click();
299 }
else configBehaviour.primaryZoomSlider=
false;
302 is_new_client_active =
true
303 $(
'[id*=_new_client]').on(
"click",
function(event){
304 console.log(
"click new client "+this.
id);
305 if (this.
id.match(
"active")) {
306 is_new_client_active =
true;
307 }
else if (this.
id.match(
"passive")) {
308 is_new_client_active =
false;
310 is_new_client_active = undefined;
313 $(
'[id*=_new_client]').removeClass(
"btn-selected");
314 $(
'#'+this.
id).addClass(
"btn-selected");
317 $(
'#getUrl').on(
"click",
function(){
319 var max_uses = parseInt($(
'#max_uses').val());
320 var invitee_name = $(
'#invitee_name').val();
323 if (isNaN(max_uses) || max_uses < 1) {
324 $(
'#invite-error').text(
'Maximum uses must be a positive number').show();
329 if (is_new_client_active && (!invitee_name || invitee_name.trim() ===
'')) {
330 $(
'#invite-error').text(
'Please enter the invitee\'s username for active links').show();
336 "type": is_new_client_active,
337 "session": my_session,
339 "max_uses": max_uses,
340 "invitee_name": invitee_name
342 console.log(
"get url clicked", cdata);
343 socket.emit(
"get_link", cdata);
345 socket.on(
"get_link_back",
function(sdata){
347 $(
'#invite-error').text(sdata.error).show();
350 console.log(
"i am the new link", sdata[
"link"]);
351 $(
'#custom-url').val(sdata[
"link"]);
352 $(
'#invite-error').hide();
357 $(
'#copy-button').on(
"click",
function(){
358 var input = document.querySelector(
"#custom-url");
359 input.setSelectionRange(0, input.value.length + 1);
361 var success = navigator.clipboard ? navigator.clipboard.writeText(input.value) : document.execCommand(
"copy");
363 console.log(
"copy success");
364 $(
'#invite-error').text(
'Copy done!').removeClass(
"alert-danger").show();
366 console.log(
"copy error");
374 var cleanModal =
function(){
375 $(
'#custom-url').val(
"URL");
376 console.log(
"url resetted");
378 $(
'#closeModal').on({
383 socket.on(
'receive_Menu_click',
function(sdata){
384 console.log(
"receive_Menu_click",sdata);
385 if ($(
'#menu'+sdata.Menu+
'>.'+sdata.optionButton).length > 0) {
386 var thisoption=$(
'#menu'+sdata.Menu+
'>.'+sdata.optionButton);
388 var opt=sdata.optionButton;
389 var thisoption=$(
'#menu'+sdata.Menu+
'>.close'+opt[0].toUpperCase()+opt.substring(1));
392 var listClass=thisoption.attr(
"class").split(
" ");
393 if ( listClass.find(
function(s) {return s.toLowerCase().indexOf(sdata.optionButton.toLowerCase()) != -1 }) != undefined) {
394 thisoption.addClass(
"NotSharedAgain");
396 thisoption.removeClass(
"NotSharedAgain");
398 var numOfEvents=$(
'#menu'+sdata.Menu).children().length;
399 for(var optionNumber=0; optionNumber<numOfEvents; optionNumber++) {
400 thisoption=$(
'#'+sdata.Menu+
'option'+optionNumber);
401 listClass=thisoption.attr(
"class").split(
" ");
402 if (listClass.find(
function(s) {return s.toLowerCase().indexOf(sdata.optionButton.toLowerCase()) != -1 }) != undefined) {
403 thisoption.addClass(
"NotSharedAgain");
405 thisoption.removeClass(
"NotSharedAgain");
413 socket.on(
'receive_click',
function(sdata){
414 console.log(
"receive_click",sdata);
415 $(
'.'+sdata.action+
'#'+sdata.id).addClass(
"NotSharedAgain");
416 $(
'.'+sdata.action+
'#'+sdata.id).click();
417 $(
'.'+sdata.action+
'#'+sdata.id).removeClass(
"NotSharedAgain");
420 emit_click=
function(action,id) {
421 if (! $(
'.'+action+
'#'+
id).hasClass(
"NotSharedAgain") && my_user !=
"Anonymous" ) {
422 cdata={
"room":my_session,
"id":id,
"action":action};
423 socket.emit(
"click", cdata, callback=
function(sdata){
424 console.log(
"socket send click ", cdata);
432 socket.on(
'receive_click_val',
function(sdata){
433 console.log(
"receive_click_val",sdata);
434 $(
'.'+sdata.action+
'#'+sdata.id).addClass(
"NotSharedAgain");
435 $(
'.'+sdata.action+
'#'+sdata.id).val(sdata[
"val"]);
436 $(
'.'+sdata.action+
'#'+sdata.id).change();
437 $(
'.'+sdata.action+
'#'+sdata.id).click();
438 $(
'.'+sdata.action+
'#'+sdata.id).removeClass(
"NotSharedAgain");
442 emit_click_val=
function(action,id,val) {
443 if (! $(
'.'+action+
'#'+
id).hasClass(
"NotSharedAgain") && my_user !=
"Anonymous" ) {
444 cdata={
"room":my_session,
"id":id,
"action":action,
"val":val};
445 socket.emit(
"click_val", cdata, callback=
function(sdata){
446 console.log(
"socket send click_val ", cdata);
454 socket.on(
'receive_Force_Opacity',
function(sdata){
455 console.log(
"receive_Force_Opacity",sdata);
457 opacity=sdata[
"Opacity"];
458 $(
'#tileOpacitySlider'+
id).val(opacity*100);
459 $(
'#tileOpacitySlider'+
id).change();
460 $(
'#'+
id).css(
"opacity", opacity);
464 receive_Add_Tag=
false
465 emit_newTag=
function(option,newTag) {
466 if (! $(
'#'+option).hasClass(
"NotSharedAgain") && my_user !=
"Anonymous" ) {
467 receive_Add_Tag=
false;
468 cdata={
"room":my_session,
"option":option,
"NewTag":newTag};
469 socket.emit(
"add_Tag", cdata, callback=
function(sdata){
470 console.log(
"Emit add new tags : ", cdata);
472 $(
'#'+option).addClass(
"NotSharedAgain")
480 socket.on(
'receive_Add_Tag',
function(sdata){
481 console.log(
"receive_Add_Tag",sdata);
482 $(
'#'+sdata.option).addClass(
"NotSharedAgain");
483 received_newtag=sdata[
"NewTag"];
484 mesh.AddNewTag(received_newtag);
485 receive_Add_Tag=
true;
486 $(
'#'+sdata.option).removeClass(
"NotSharedAgain");
490 socket.on(
'receive_Color_Tag',
function(sdata){
491 console.log(
"receive_Color_Tag",sdata);
492 mesh.ChangeColorTag(sdata[
"OldTag"],sdata[
"TagColor"])
495 socket.on(
'receive_deploy_Session',
function(sdata){
496 console.log(
"receive_deploy_Session",sdata);
497 $(
'#gGnewroom').val(sdata[
'NewRoom']);
498 $(
'#notifications').html(
'<div id=ValidateNewRoom height="10%" width="50%" style="font-size:100" ></div>');
499 $(
"#ValidateNewRoom").append(
'<h1> Are you OK to change for this room ? Yes = click "Submit"</h1>'
500 +
'<button id="ChangeRoomNo" name="ChangeRoomNo" class="btn btn-info" >No</button>');
501 $(
"#ChangeRoomNo").on(
"click",
function() {
502 $(
"#ValidateNewRoom").remove()
504 if ( my_user ==
"Anonymous" ) {
505 $(
'#gGsubmit').click()
511 socket.on(
'receive_deploy_Config',
function(sdata){
512 console.log(
"receive_deploy_Config",sdata);
517 $(
'#notifications').html(
'<div id=ValidateNewConfig height="10%" width="50%" style="font-size:100" ></div>');
518 $(
"#ValidateNewConfig").append(
'<h1> Are you OK to change for the new config ?</h1>'
519 +
'<button id="ChangeConfigYes" name="ChangeConfigYes" class="btn btn-info" >Yes</button>'
520 +
'<button id="ChangeConfigNo" name="ChangeConfigNo" class="btn btn-info" >No</button>');
521 $(
"#ChangeConfigYes").on(
"click",
function() {
522 configJson=sdata[
"Config"];
523 UpdateParameters(configJson);
524 $(
"#ValidateNewConfig").remove()
526 $(
"#ChangeConfigNo").on(
"click",
function() {
527 $(
"#ValidateNewConfig").remove()
529 if ( my_user ==
"Anonymous" ) {
530 $(
'#ChangeConfigYes').click()
535 mesh =
new Mesh(mesh_cardinal,bool_fix_number_of_columns,maximal_number_of_columns);
536 mesh.meshEventStart();
538 $(
'body').css(
'background-image',
'url(../static/images/fond.png)');
540 suggestion_list = globalTagsList
541 .concat($(
'.info').map(
function(){
return $.trim($(
this).text());}).get())
542 .concat(me.getNodesByLoc().map(
function(e){return $.trim(e.getJsonData().comment); }));
564 get_newwindowRatio();
569 console.log(err,
true);