locations.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. var xOffset = 20;
  2. var yOffset = 20;
  3. var canvas;
  4. var ctx;
  5. var height = 600;
  6. var width = 500;
  7. body.on('click','#add_location',function(){AddLocation();});
  8. body.on('click','#add_loc_dialog',function(){AddNewLocationDialog();});
  9. body.on('click','#del_loc',function(){DeleteLocation(GetSelectedLocId() );});
  10. body.on('change','#locations',function(){GetSelectedLocId();});
  11. body.on('click','#button_beacons_draw',function(){getTestCoordinate();});
  12. body.on('change','#users_position_loc',function(){getUserTasks(this);});
  13. body.on('change','#tasks_select',function(){tasksSelect(this);});
  14. var canvas = $("#canvas")[0];
  15. $(function() {
  16. canvas = document.getElementById('canvas');
  17. if (canvas.getContext)
  18. ctx = canvas.getContext('2d');
  19. else
  20. alert('canvas unsupported');
  21. LoadLocations();
  22. MainLoop();//chatLoop();
  23. // DrawRect();
  24. });
  25. var parseQueryString = function (strQuery) {
  26. var strSearch = strQuery.substr(1),
  27. strPattern = /([^=]+)=([^&]+)&?/ig,
  28. arrMatch = strPattern.exec(strSearch),
  29. objRes = {};
  30. while (arrMatch != null) {
  31. objRes[arrMatch[1]] = arrMatch[2];
  32. arrMatch = strPattern.exec(strSearch);
  33. }
  34. return objRes;
  35. };
  36. var getParam = parseQueryString(window.location.search);
  37. function sleep(ms) {
  38. return new Promise(resolve => setTimeout(resolve, ms));
  39. }
  40. function tasksSelect(select) {
  41. var user = select.options[select.selectedIndex];
  42. // alert(user.value);
  43. var str = user.value;
  44. //var json = JSON.parse(user.value);
  45. var myarr = str.split(",");
  46. // alert('uval'+myarr[0]);
  47. $('#date_timepicker_start').val(myarr[2]);
  48. $('#date_timepicker_end').val(myarr[3]);
  49. }
  50. function getUserTasks(select) {
  51. var user = select.options[select.selectedIndex];
  52. var dict = new Object(); //or Map()
  53. dict[ 'get_user_tasks' ] = user.value;
  54. sendAjax('', dict, UserTasks);
  55. }
  56. function ToggleDisplay() {
  57. // if (series.value == 0)
  58. // {
  59. // $("#sections_container").css("display", "none");
  60. // }
  61. // else {
  62. // $("#sections_container").css("display", "block");
  63. // }
  64. }
  65. function UserTasks(data) {
  66. // alert(data);
  67. var json = JSON.parse(data);
  68. var htm = "<option value='0'><Выберите Задачу></option>";
  69. for (var i =0;i<json.length; i++) {
  70. htm += "<option value='"+json[i]+"'>"+json[i][0] +" Проект:"+json[i][1]+"</option>";
  71. }
  72. $("#tasks_сont").css("display", "flex");
  73. $('#tasks_select').html(htm);
  74. }
  75. function DrawRect(x, y) {
  76. ctx.fillStyle = 'rgb(200, 0, 0)';
  77. ctx.strokeRect(xOffset, yOffset, x, y);
  78. }
  79. function ClearRect() {
  80. ctx.clearRect(0, 0, width, height);
  81. }
  82. function DrawCircle(x, y, radius)
  83. {
  84. x = parseInt(x);
  85. y = parseInt(y);
  86. ctx.fillStyle = 'rgb(200, 0, 0)';
  87. ctx.beginPath();
  88. ctx.arc(x+xOffset, y+yOffset, radius, 0, Math.PI * 2, true);
  89. ctx.closePath();
  90. ctx.stroke();
  91. }
  92. function AddNewLocationDialog()
  93. {
  94. $("#cont").show();
  95. }
  96. function GetSelectedLocId() {
  97. var select = $("#locations")[0];
  98. //var id = select.options[select.selectedIndex].value;
  99. var id = $('#locations').val();
  100. if (id == 0) {
  101. canvas.width = 0;
  102. canvas.height = 0;
  103. }
  104. return id;
  105. }
  106. var iCount = 0;
  107. var listItems = [];
  108. async function MainLoop()
  109. {
  110. while (true) {
  111. await sleep(500);
  112. var locid = GetSelectedLocId();
  113. GetBeacons(locid);
  114. GetUsers(locid);
  115. ///////// CHAT
  116. if ( 'locations' == getParam) {
  117. iCount = 0;
  118. $('#scrollFieldChat > div').each(function(){
  119. listItems[iCount] = $(this).attr('id');
  120. iCount++;
  121. });
  122. count_massages = $('#new_massage_count').text();
  123. if ( 0 < Number(count_massages)) {
  124. $('#new_massage_count').removeClass("label-default");
  125. $('#new_massage_count').addClass("label-success");
  126. } else {
  127. $('#new_massage_count').removeClass("label-success");
  128. $('#new_massage_count').addClass("label-default");
  129. }
  130. getNewMassage(listItems[iCount-1]);
  131. }
  132. /////////
  133. }
  134. }
  135. function ReDraw() {
  136. if (canvas.width == 0) {
  137. canvas.width = 500;
  138. canvas.height = 600;
  139. }
  140. ClearRect();
  141. DrawRect(400, 500);
  142. for (var i =0;i<beaconData.length; i++) {
  143. DrawCircle(beaconData[i].x, beaconData[i].y, 5);
  144. }
  145. DrawCircle(userdata.x, userdata.y, 10);
  146. }
  147. function GetBeacons(loc_id) {
  148. var dict = new Object(); //or Map()
  149. dict[ 'beacons_loc' ] = loc_id;
  150. sendAjax('location_beacons', dict, DrawBeacons);
  151. }
  152. function GetUsers(loc_id) {
  153. var dict = new Object(); //or Map()
  154. dict[ 'users_loc' ] = loc_id;
  155. sendAjax('location_users', dict, DrawUsers);
  156. }
  157. var beaconData;
  158. var userdata;
  159. function DrawBeacons(data) {
  160. data = JSON.parse(data);
  161. beaconData = data;
  162. $('#' + 'location_beacons').html('');
  163. for (var i =0;i<data.length; i++) {
  164. $('#' + 'location_beacons').append(data[i].id + " X:" + data[i].x + " Y:" + data[i].y + " <br>");
  165. }
  166. }
  167. function DrawUsers(data) {
  168. data = JSON.parse(data);
  169. userdata = data;
  170. console.log(data);
  171. $('#'+'location_users').html(data.name+" X:"+data.x+" Y:"+data.y+" <b>Зона:</b> "+data.Zone);
  172. ReDraw();
  173. }
  174. function DeleteLocation(id) {
  175. var dict = new Object(); //or Map()
  176. dict[ 'del_loc' ] = id;
  177. sendAjax('result', dict, LoadLocations);
  178. }
  179. function LoadLocations() {
  180. $.ajax({
  181. type: "POST",
  182. url: "response.php",
  183. data: { "load_locs": 1},
  184. dataType: "html",
  185. success: function(data){
  186. $("#location_div").html(data);
  187. },
  188. failure: function(errMsg) {
  189. alert(errMsg);
  190. }
  191. });
  192. }
  193. function AddLocation() {
  194. var name = $('#loc_name').val();
  195. var desc = $('#loc_desc').val();
  196. sendAjaxForm('result', 'ajax_form', 'response.php?add_loc='+name+'&desc='+desc);
  197. LoadLocations();
  198. }
  199. //////////////////////////// Отрисовка пути /////////////
  200. /* var hotspots=[
  201. {x:100,y:100,radius:20,tip:'You are over 100,100'},
  202. {x:100,y:200,radius:20,tip:'You are over 100,200'},
  203. ]; */
  204. var hotspots=[];
  205. var numbers;
  206. function MyFunc(data){
  207. var canvas = document.getElementById('canvasa');
  208. var ctx = canvas.getContext('2d');
  209. numbers = JSON.parse(data);
  210. //ctx.clearRect(0, 0, width, height);
  211. drawPath();
  212. }
  213. var myFunc2Data;
  214. function MyFunc2 (data){
  215. var canvas=document.getElementById("canvasa");
  216. var ctx=canvas.getContext("2d");
  217. ctx.clearRect(0,0,width, height);
  218. data = JSON.parse(data);
  219. myFunc2Data = data;
  220. drawZones(data.point_zones);
  221. drawBeacons(data.point_beacons);
  222. $('#canvasa').css("background-image", "url(images/depo_img/" + data.image);
  223. }
  224. function getTestCoordinate( loc_id = 22 ) {
  225. var dict = new Object(); //or Map()
  226. dict = {
  227. users_markers: document.getElementById('users_position_loc').value,
  228. //time_markers: document.getElementById('time_position_loc').value,
  229. depo_markers: document.getElementById('depo_position_loc').value,
  230. date_start: document.getElementById('date_timepicker_start').value,
  231. date_stop: document.getElementById('date_timepicker_end').value,
  232. };
  233. img = {get_img: 1,depo_markers: document.getElementById('depo_position_loc').value};
  234. sendAjax('location_users_', img, MyFunc2);
  235. sendAjax('location_users_', dict, MyFunc);
  236. }
  237. var timer;
  238. var counter = 1;
  239. var counterI = 0;
  240. var StopLoop = false;
  241. var tempColor_x = '';
  242. var tempColor_y = '';
  243. function drawPath(){
  244. var canvas = document.getElementById('canvasa');
  245. var ctx = canvas.getContext('2d');
  246. var myColor = '';
  247. if ( null == numbers){
  248. return true;
  249. }
  250. numbers.forEach( function(item, i, arr) {
  251. //console.log('y = '+item.coord_y);
  252. if( i == counter) {
  253. tempColor_x = item.coord_x;
  254. tempColor_y = item.coord_y;
  255. myColor = item.rgb;
  256. return;
  257. }
  258. });
  259. ctx.fillStyle = myColor;
  260. ctx.fillRect(tempColor_x,tempColor_y, 5 , 5 );
  261. counterI += 1;
  262. counter += 1;
  263. if ( true == StopLoop){
  264. numbers = null;
  265. return true;
  266. }
  267. //console.log(StopLoop);
  268. setTimeout(drawPath,50);
  269. return true;
  270. }
  271. function drawBeacons(data) {
  272. ctxa.strokeStyle = "blue";
  273. data.forEach( function(item, i, arr) {
  274. tempColor_x = item.x;
  275. tempColor_y = item.y;
  276. ctxa.beginPath();
  277. ctxa.arc(item.x,item.y,5,0,Math.PI*2);
  278. ctxa.closePath();
  279. ctxa.stroke();
  280. });
  281. ctxa.strokeStyle = "black";
  282. return true;
  283. }
  284. /////////////////////////// !!!!!!!!!!!!!! /////////////
  285. /*
  286. var canvas=document.getElementById("canvasa");
  287. var ctx=canvas.getContext("2d");
  288. var cw=canvas.width;
  289. var ch=canvas.height;
  290. function reOffset(){
  291. var BB=canvas.getBoundingClientRect();
  292. offsetX=BB.left;
  293. offsetY=BB.top;
  294. }
  295. reOffset();
  296. window.onscroll=function(e){ reOffset(); }
  297. window.onresize=function(e){ reOffset(); }
  298. *//*
  299. var offsetX,offsetY;
  300. $("#canvasa").mousemove(function(e){handleMouseMove(e);});
  301. function draw(numbers){
  302. for(var i=0;i < numbers.length;i++){
  303. var h=numbers[i];
  304. ctx.beginPath();
  305. ctx.arc(h.coord_x,h.coord_y,h.radius,0,Math.PI*2);
  306. ctx.closePath();
  307. ctx.stroke();
  308. }
  309. }
  310. function handleMouseMove(e){
  311. var canvas = document.getElementById('canvasa');
  312. var ctx = canvas.getContext('2d');
  313. var cw=canvas.width;
  314. //var ch=canvas.height;
  315. // tell the browser we're handling this event
  316. console.log(e.preventDefault());
  317. e.preventDefault();
  318. e.stopPropagation();
  319. mouseX=parseInt(e.clientX-offsetX);
  320. mouseY=parseInt(e.clientY-offsetY);
  321. //ctx.clearRect(0,0,cw,ch);
  322. //draw();
  323. for(var i=0;i<hotspots.length;i++){
  324. var h=hotspots[i];
  325. var dx=mouseX-h.x;
  326. var dy=mouseY-h.y;
  327. if(dx*dx+dy*dy<h.radius*h.radius){
  328. ctx.fillText(h.tip,h.x,h.y);
  329. }
  330. }
  331. }
  332. */
  333. var canvasa = document.getElementById('canvasa');
  334. var ctxa = canvasa.getContext('2d');
  335. function reOffset(){
  336. var BB=canvasa.getBoundingClientRect();
  337. offsetX=BB.left;
  338. offsetY=BB.top;
  339. }
  340. var offsetX,offsetY;
  341. reOffset();
  342. window.onscroll=function(e){ reOffset(); }
  343. window.onresize=function(e){ reOffset(); }
  344. //draw();
  345. $("#canvasa").mousemove(function(e){handleMouseMove(e);});
  346. function draw() {
  347. var tempColor_x = '';
  348. var tempColor_y = '';
  349. var myColor = 'black';
  350. numbers.forEach( function(item, i, arr) {
  351. tempColor_x = item.coord_x;
  352. tempColor_y = item.coord_y;
  353. //ctxa.fillStyle = myColor;
  354. //ctxa.fillRect(tempColor_x,tempColor_y, 5 , 5 );
  355. ctxa.beginPath();
  356. ctxa.arc(item.coord_x,item.coord_y,item.radius,0,Math.PI*2);
  357. ctxa.closePath();
  358. ctxa.stroke();
  359. });
  360. ctxa.strokeStyle = "black";
  361. ctxa.lineWidth = "1";
  362. return true;
  363. /*
  364. if ( hotspots.length > 0 ) {
  365. for(var i=0;i<hotspots.length;i++){
  366. var h=hotspots[i];
  367. ctxa.beginPath();
  368. ctxa.arc(h.x,h.y,h.radius,0,Math.PI*2);
  369. ctxa.closePath();
  370. ctxa.stroke();
  371. }
  372. }
  373. */
  374. }
  375. $("#button_beacons_add").on('click', function(){
  376. $("#add_zone_depo").attr('data', 0);
  377. $("#add_zone_depo").css('display', 'none');
  378. $("#add_beacon_depo").toggle( "slow", function() {
  379. if ( 1 == $("#toggle_val_add").attr('value') ){
  380. $("#toggle_val_add").attr('value', 0);
  381. } else {
  382. $("#toggle_val_add").attr('value',1);
  383. }
  384. });
  385. });
  386. /// ================ Zones ========================
  387. $("#button_zones_add").on('click', function(){
  388. $("#add_beacon_depo").attr('value', 0);
  389. $("#add_beacon_depo").css('display', 'none');
  390. $("#add_zone_depo").toggle( "slow", function() {
  391. if ( 1 == $('#button_zones_add').attr('data') ){
  392. $('#button_zones_add').attr('data', 0);
  393. } else {
  394. $('#button_zones_add').attr('data',1);
  395. }
  396. });
  397. });
  398. var parsePointsArray;
  399. function drawZones(data) {
  400. data.forEach( function(item, i, arr) {
  401. if ( null != item.borders ) {
  402. parsePointsArray = JSON.parse(item.borders);
  403. if ( 1 < parsePointsArray.coordinates.length) {
  404. var c1 = parsePointsArray.coordinates[parsePointsArray.coordinates.length-1];
  405. var c2 = parsePointsArray.coordinates[parsePointsArray.coordinates.length-2];
  406. //ctxa.strokeStyle = "red";
  407. //ctxa.lineWidth = "5";
  408. //d1 = Math.abs(c1.X - c2.X)/2;
  409. //d2 = Math.abs(c1.Y - c2.Y)/2;
  410. d1 = (Number(c1.X) + Number(c2.X))/2;
  411. d2 = (Number(c1.Y) + Number(c2.Y))/2;
  412. ctxa.beginPath();
  413. //console.log(typeof Math.round(d1));
  414. //console.log(typeof Math.round(c1.X));
  415. //console.log(Math.round(d1) + c1.X);
  416. //console.log(parsePointsArray);
  417. //console.log(d1);
  418. //console.log(typeof Math.round(c1.Y));
  419. //var t = Number(Math.round(d2)) + Number(c1.Y);
  420. //console.log(t);
  421. ctxa.fillText(item.description,d1,d2);
  422. //ctxa.arc(d1 ,d2 ,5,0,Math.PI*2);
  423. ctxa.closePath();
  424. ctxa.stroke();
  425. ctxa.moveTo(c1.X,c1.Y);
  426. ctxa.lineTo(c1.X,c2.Y);
  427. ctxa.lineTo(c2.X,c2.Y);
  428. ctxa.lineTo(c2.X,c1.Y);
  429. ctxa.closePath();
  430. ctxa.stroke();
  431. }
  432. }
  433. });
  434. ctxa.strokeStyle = "black";
  435. ctxa.lineWidth = "1";
  436. return true;
  437. }
  438. /// ================ Zones ========================
  439. $("#button_beacons_clear").on('click', function(){
  440. ctxa.clearRect(0,0,width,height);
  441. points_zone_one = null;
  442. points_zone_all = null;
  443. tempColor_x = '';
  444. tempColor_y = '';
  445. myFunc2Data = null;
  446. numbers = null;
  447. data = null;
  448. StopLoop = true;
  449. //numbers = '';
  450. });
  451. var add_beacon_depo_arr;
  452. var points_zone_one = null;
  453. var points_zone_all = [];
  454. var points_zone;
  455. $("#canvasa").on('click', function(){
  456. if ( 1 == $("#toggle_val_add").attr('value') ) {
  457. ctxa.clearRect(0,0,width,height);
  458. $("#uid_beacon").val();
  459. add_beacon_depo_arr = {x:pointCursorX,y:pointCursorY,location_id:$("#depo_position_loc").val(),uuid:$("#uid_beacon").val(),beacon_item:1};
  460. add_beacon_depo_obj = [{x:pointCursorX,y:pointCursorY,location_id:$("#depo_position_loc").val(),uuid:$("#uid_beacon").val(),beacon_item:1}];
  461. ctxa.beginPath();
  462. ctxa.arc(pointCursorX, pointCursorY, 5, 0, Math.PI*2 );
  463. ctxa.closePath();
  464. ctxa.stroke();
  465. }
  466. if ( 1 == $('#button_zones_add').attr('data') ) {
  467. //ctxa.strokeStyle='red';
  468. if (null != points_zone_one){
  469. pointCursorX_auto_1 = {x:pointCursorX,y:points_zone_one.y};
  470. pointCursorX_auto_2 = {x:points_zone_one.x,y:pointCursorY};
  471. points_zone_two = {pointCursorX,pointCursorY};
  472. ctxa.beginPath();
  473. ctxa.arc(pointCursorX, pointCursorY, 5, 0, Math.PI*2 );
  474. ctxa.closePath();
  475. ctxa.stroke();
  476. ctxa.beginPath();
  477. ctxa.lineWidth = "5";
  478. ctxa.moveTo(points_zone_one.x,points_zone_one.y);
  479. ctxa.lineTo(pointCursorX_auto_1.x,pointCursorX_auto_1.y);
  480. ctxa.lineTo(pointCursorX,pointCursorY);
  481. ctxa.lineTo(pointCursorX_auto_2.x,pointCursorX_auto_2.y);
  482. ctxa.closePath();
  483. ctxa.stroke();
  484. points_zone_all = {'coordinates':[{'X':points_zone_one.x,'Y':points_zone_one.y},{'X':pointCursorX,'Y':pointCursorY}]};
  485. points_zone_one = null;
  486. //console.log(points_zone_all);
  487. return true;
  488. }
  489. if (null == points_zone_one){
  490. points_zone_one = {x:pointCursorX,y:pointCursorY};
  491. ctxa.beginPath();
  492. ctxa.arc(pointCursorX, pointCursorY, 5, 0, Math.PI*2 );
  493. ctxa.closePath();
  494. ctxa.stroke();
  495. }
  496. //ctxa.clearRect(0,0,width,height);
  497. }
  498. });
  499. $("#add_beacon_depo").on('click', function(e){
  500. e.preventDefault();
  501. var error = '';
  502. add_beacon_depo_obj.forEach( function(item, i, arr) {
  503. if( '' == item.x){
  504. error += "Нет координаты x";
  505. }
  506. if( '' == item.y){
  507. error += "Нет координаты y";
  508. }
  509. if( '' == item.location_id){
  510. error += "Не выбрана локация";
  511. }
  512. if( '' == item.uuid){
  513. error += "Не заполнено поле uuid";
  514. }
  515. });
  516. if ( '' == error) {
  517. sendAjax('location_users_', add_beacon_depo_arr, AddBeacon);
  518. } else {
  519. $('#beacon_errors').text(error);
  520. }
  521. add_beacon_depo_arr = [];
  522. });
  523. function AddBeacon(data){
  524. addInfo = JSON.parse(data);
  525. /*if(){
  526. $('#beacon_errors').text(addInfo);
  527. } else {
  528. $('#beacon_success').text(addInfo);
  529. }
  530. */
  531. }
  532. //$("#button_beacons_add").on('click', function(){
  533. // $("#add_beacon_depo").show();
  534. // console.log('Вы нажали на элемент "foo"');
  535. //});
  536. var pointCursorX;
  537. var pointCursorY;
  538. function handleMouseMove(e){
  539. if (numbers.length < counterI) {
  540. e.preventDefault();
  541. e.stopPropagation();
  542. mouseX = parseInt(e.clientX-offsetX,10);
  543. mouseY = parseInt(e.clientY-offsetY,10);
  544. pointCursorX = mouseX;
  545. pointCursorY = mouseY;
  546. //console.log(mouseX);
  547. // console.log(mouseY);
  548. if ( 1 != $("#toggle_val_add").attr('value') && 1 != $('#button_zones_add').attr('data')) {
  549. ctxa.clearRect(0,0,width,height);
  550. }
  551. draw();
  552. drawZones(myFunc2Data.point_zones);
  553. drawBeacons(myFunc2Data.point_beacons);
  554. numbers.forEach( function(item, i, arr) {
  555. var dx = mouseX - parseInt(item.coord_x,10);
  556. var dy = mouseY - parseInt(item.coord_y,10);
  557. dx = dx*dx;
  558. dy = dy*dy;
  559. if(dx+dy < item.radius*item.radius){
  560. ctxa.fillStyle = 'red';
  561. ctxa.fillText(item.ts,item.coord_x,item.coord_y);
  562. }
  563. });
  564. }
  565. }
  566. /////////////////////////// !!!!!!!!!!!!!! /////////////
  567. //////////////////////////// Отрисовка пути /////////////