Advertisement
Guest User

Untitled

a guest
Jul 6th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.63 KB | None | 0 0
  1.  
  2. {% extends "vast_simulator/base.html" %}
  3. {% block content %}
  4. <script src="http://code.highcharts.com/highcharts.js"></script>
  5. <script src="http://code.highcharts.com/modules/exporting.js"></script>
  6. <script src="/static/script/moment.js"></script>
  7. <script src="/static/jquery.dataTables.js"></script>
  8. <script src="/static/dataTables.fixedColumns.js"></script>
  9. <script src="/static/dataTables.bootstrap.js"></script>
  10. <script src="https://maps.googleapis.com/maps/api/js"></script>
  11. <link href="/static/css/calendarUI.css" rel="stylesheet"/>
  12. <link href="/static/bootstrap.min.css" rel="stylesheet"/>
  13. <link href="/static/dataTables.bootstrap.css" rel="stylesheet"/>
  14. <style>
  15. td { white-space: nowrap; }
  16. .dataTables_wrapper {
  17. /*width: 800px;*/
  18. margin: 0 auto;
  19. }
  20. .dataTables_filter{
  21. visibility:hidden;
  22. }
  23. .dataTables_info{
  24. visibility:hidden;
  25. }
  26.  
  27. </style>
  28. <script type="text/javascript">
  29.  
  30. function parseURLParams(url) {
  31. var queryStart = url.indexOf("?") + 1,
  32. queryEnd = url.indexOf("#") + 1 || url.length + 1,
  33. query = url.slice(queryStart, queryEnd - 1),
  34. pairs = query.replace(/\+/g, " ").split("&"),
  35. parms = {}, i, n, v, nv;
  36.  
  37. if (query === url || query === "") {
  38. return;
  39. }
  40.  
  41. for (i = 0; i < pairs.length; i++) {
  42. nv = pairs[i].split("=");
  43. n = decodeURIComponent(nv[0]);
  44. v = decodeURIComponent(nv[1]);
  45.  
  46. if (!parms.hasOwnProperty(n)) {
  47. parms[n] = [];
  48. }
  49.  
  50. parms[n].push(nv.length === 2 ? v : null);
  51. }
  52. return query;
  53. }
  54.  
  55.  
  56. var polyline;
  57. var map = null;
  58. function initialize() {
  59. var mapOptions = {
  60. zoom: 2,
  61. center: new google.maps.LatLng(51.508742,-0.120850)
  62. };
  63.  
  64. map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
  65.  
  66. var polyOptions = {
  67. strokeColor: '#000000',
  68. strokeOpacity: 1.0,
  69. strokeWeight: 3
  70. };
  71.  
  72. polyline = new google.maps.Polyline(polyOptions);
  73. polyline.setMap(map);
  74.  
  75. var route = JSON.parse((("{{route}}").replace(/&(l|g|quo)t;/g, function(a,b){
  76. return {
  77. l : '<',
  78. g : '>',
  79. quo : '"'
  80. }[b];
  81. })));
  82.  
  83. var path = polyline.getPath();
  84. console.log(route[0][0]);
  85. for(var i = 0; i < route.length; i++){
  86. // console.log("hi");
  87. path.push( new google.maps.LatLng(route[i][0], route[i][1]));
  88. }
  89.  
  90. }
  91.  
  92. google.maps.event.addDomListener(window, 'load', initialize);
  93. // alert(polyline);
  94. </script>
  95. <script type="text/javascript">
  96. $.getScript('http://arshaw.com/js/fullcalendar-1.6.4/fullcalendar/fullcalendar.min.js',function(){
  97.  
  98. var date = new Date();
  99. var d = date.getDate();
  100. var m = date.getMonth();
  101. var y = date.getFullYear();
  102.  
  103. var vp = (("{{json_plan}}").replace(/&(l|g|quo)t;/g, function(a,b){
  104. return {
  105. l : '<',
  106. g : '>',
  107. quo : '"'
  108. }[b];
  109. }));
  110.  
  111. // var eta = (("{{ETA}}").replace(/&(l|g|quo)t;/g, function(a,b){
  112. // return {
  113. // l : '<',
  114. // g : '>',
  115. // quo : '"'
  116. // }[b];
  117. // }));
  118. // alert(eta);
  119.  
  120. var plan_type = (("{{plan_type}}").replace(/&(l|g|quo)t;/g, function(a,b){
  121. return {
  122. l : '<',
  123. g : '>',
  124. quo : '"'
  125. }[b];
  126. }));
  127. // alert(plan_type);
  128. var formatted_data = JSON.parse(vp);
  129.  
  130. var events = [];
  131. var date_prev = formatted_data[0].date;
  132.  
  133. var speed_day = 0;
  134. var foc_day = 0;
  135. var actual_rpm_day = 0;
  136. var distance_covered_day = 0;
  137. var wind_force_day = 0;
  138.  
  139.  
  140. var count_day = 0;
  141.  
  142.  
  143. for(var i = 0; i < formatted_data.length; i++){
  144. var title = "Avg Rpm " + formatted_data[i].actual_speed
  145. var date = moment(formatted_data[i].date.substring(0, 19)).toDate();
  146. var end = moment(formatted_data[i].date.substring(0, 19)).add(6, 'hour').toDate();
  147. events.push({
  148. title : title,
  149. start : date,
  150. end : end,
  151. allDay : false
  152. })
  153.  
  154. if(formatted_data[i].date.substring(0, 11) != date_prev.substring(0, 11)){
  155.  
  156. // console.log("sdfsdsdgds testin "+ speed_day + " count " + count_day);
  157. speed_day = speed_day/count_day;
  158. foc_day = foc_day/count_day;
  159. actual_rpm_day = actual_rpm_day/count_day;
  160. distance_covered_day = distance_covered_day/count_day;
  161. wind_force_day = wind_force_day/count_day;
  162.  
  163. events.push({
  164. title : "avg speed " + speed_day.toFixed(1),
  165. start : date_prev.substring(0,19),
  166. allDay : true
  167. })
  168. events.push({
  169. title : "Distance completed" + distance_covered_day.toFixed(1),
  170. start : date_prev.substring(0,19),
  171. allDay : true
  172. })
  173. events.push({
  174. title : "avg rpm " + actual_rpm_day.toFixed(1),
  175. start : date_prev.substring(0,19),
  176. allDay : true
  177. })
  178. events.push({
  179. title : "FOC " + foc_day.toFixed(1),
  180. start : date_prev.substring(0,19),
  181. allDay : true
  182. })
  183. events.push({
  184. title : "wind force " + wind_force_day.toFixed(1),
  185. start : date_prev.substring(0,19),
  186. allDay : true
  187. })
  188. date_prev = formatted_data[i].date
  189.  
  190. speed_day = 0;
  191. foc_day = 0;
  192. actual_rpm_day = 0;
  193. distance_covered_day = 0;
  194. wind_force_day = 0;
  195.  
  196.  
  197. count_day = 0;
  198.  
  199. }
  200. else{
  201.  
  202. speed_day += formatted_data[i].actual_speed;
  203. foc_day += formatted_data[i].foc;
  204. actual_rpm_day += formatted_data[i].actual_rpm;
  205. distance_covered_day += formatted_data[i].distance_covered;
  206. wind_force_day += formatted_data[i].wind_force;
  207. count_day++;
  208. // console.log(" testin "+ speed_day + " count " + count_day);
  209. }
  210.  
  211.  
  212. }
  213.  
  214. $('#calendar').fullCalendar({
  215. header: {
  216. left: 'prev,next today',
  217. center: 'title',
  218. right: 'month,agendaWeek,agendaDay'
  219. },
  220. editable: true,
  221. eventMouseover :function(event, jsEvent, view) {
  222.  
  223. },
  224. eventMouseout :function(event, jsEvent, view) {
  225.  
  226. },
  227. eventRender: function(event, element) {
  228. var view = $('#calendar').fullCalendar('getView');
  229. if (view.name == 'month' && !event.allDay) return false;
  230. },
  231. events : events,
  232. dayClick: function() {
  233. alert('a day has been clicked!');
  234. }
  235. });
  236. })
  237.  
  238. </script>
  239. <script type="text/javascript">
  240.  
  241. var vp = (("{{json_plan}}").replace(/&(l|g|quo)t;/g, function(a,b){
  242. return {
  243. l : '<',
  244. g : '>',
  245. quo : '"'
  246. }[b];
  247. }));
  248. alert("{{detailed_plan}}");
  249. var plan_type = (("{{plan_type}}").replace(/&(l|g|quo)t;/g, function(a,b){
  250. return {
  251. l : '<',
  252. g : '>',
  253. quo : '"'
  254. }[b];
  255. }));
  256. var formatted_data = JSON.parse(vp);
  257.  
  258. $(document).on('click', '#save_plan', function(){
  259. data = parseURLParams(window.location.href);
  260. alert(data);
  261. $.ajax({
  262. url: "/vast/save_plan?" + data,
  263. type : "GET",
  264. success:function(data){
  265. alert(data);
  266. },
  267. error:function(err){
  268. console.log((err));
  269. }
  270. });
  271. // alert();
  272. });
  273.  
  274. </script>
  275. <div class="row">
  276. <div class="col-lg-12">
  277. <h1 class="page-header">Voyage Plan</h1>
  278. </div>
  279. <!-- /.col-lg-12 -->
  280. </div>
  281. <!-- /.row -->
  282. <div class = "panel panel-default">
  283. <div class = "panel-heading"><i class="fa fa-globe fa-fw"></i> Voyage Route</div>
  284. <div class = "panel-body">
  285. <div class="col-lg-12" id="map_canvas" style="height:350px;"></div>
  286. </div>
  287. </div>
  288.  
  289. <div class="row">
  290. <div class="col-lg-3 col-md-3">
  291. <div class="panel" style = "background-color : #44B78B; color : white">
  292. <div class="panel-heading">
  293. <div class="row">
  294. <div class="col-xs-3">
  295. <i class="fa fa-calendar fa-5x"></i>
  296. </div>
  297. <div class="col-xs-9 text-right">
  298. <div>ETA</div>
  299. <div class="" style="font-size:20px;">{{ ETA|date:'M d, Y H:i'}}</div>
  300.  
  301. </div>
  302. </div>
  303. </div>
  304.  
  305. </div>
  306. </div>
  307. <div class="col-lg-3 col-md-3">
  308. <div class="panel" style = "background-color : #6666FF; color : white">
  309. <div class="panel-heading">
  310. <div class="row">
  311. <div class="col-xs-3">
  312. <i class="fa fa-dashboard fa-5x"></i>
  313. </div>
  314. <div class="col-xs-9 text-right">
  315. <div>Avg Speed (Kts)</div>
  316. <div class="huge">{{ detailed_plan.summary.avg_speed | floatformat:1}}</div>
  317.  
  318. </div>
  319. </div>
  320. </div>
  321.  
  322. </div>
  323. </div>
  324. <div class="col-lg-3 col-md-3">
  325. <div class="panel" style = "background-color :#3399FF; color : white">
  326. <div class="panel-heading">
  327. <div class="row">
  328. <div class="col-xs-3">
  329. <i class="fa fa-gears fa-5x"></i>
  330. </div>
  331. <div class="col-xs-9 text-right">
  332. <div>Avg RPM</div>
  333. <div class="huge">{{ detailed_plan.summary.avg_rpm | floatformat:1}}</div>
  334.  
  335. </div>
  336. </div>
  337. </div>
  338.  
  339. </div>
  340. </div>
  341. <div class="col-lg-3 col-md-3">
  342. <div class="panel" style = "background-color : #A68400; color : white">
  343. <div class="panel-heading">
  344. <div class="row">
  345. <div class="col-xs-3">
  346. <i class="fa fa-tint fa-5x"></i>
  347. </div>
  348. <div class="col-xs-9 text-right">
  349. <div>Total FOC (MT)</div>
  350. <div class="huge">{{ detailed_plan.summary.total_foc |floatformat:0}}</div>
  351.  
  352. </div>
  353. </div>
  354. </div>
  355.  
  356. </div>
  357. </div>
  358. </div>
  359. <!-- /.row -->
  360.  
  361. <hr>
  362. <div class="col-lg-12">
  363. <div class ="panel panel-default">
  364. <div class = "panel-heading"><i class="fa fa-calendar fa-fw"></i> Planned Voyage Schedule</div>
  365. <div class = "panel-body">
  366. <div class="table-responsive col-lg-12">
  367. <table id="plan" class="table table-striped table-bordered" cellspacing="0" width="100%">
  368. <thead>
  369. <tr>
  370. <th>Date</th>
  371. {% for plan in detailed_plan.schedule %}
  372. <th>{{plan.date | date:"SHORT_DATETIME_FORMAT"}}</th>
  373. {% endfor %}
  374. </tr>
  375. </thead>
  376. <tbody>
  377. <tr style="background-color:white;color:#3ab98c">
  378. <th style="background-color:#3ab98c;color:white">Port Name</th>
  379. {% for plan in detailed_plan.schedule %}
  380. {%ifequal plan.port_name None%}
  381. <td>way pt.({{plan.lat|floatformat:"1"}},{{plan.lon|floatformat:"1"}})</td>
  382. {%else%}
  383. <td>{{plan.port_name}}({{plan.lat|floatformat:"1"}},{{plan.lon|floatformat:"1"}})</td>
  384. {%endifequal%}
  385. {% endfor %}
  386. </tr>
  387. <tr style="background-color:white;color:#3ab98c">
  388. <th style="background-color:#3ab98c;color:white">Actual Speed</th>
  389. {% for plan in detailed_plan.schedule %}
  390. <td>{{plan.actual_speed|floatformat:"2"}}</td>
  391. {% endfor %}
  392. </tr>
  393. <tr style="background-color:white;color:#3ab98c">
  394. <th style="background-color:#3ab98c;color:white">Estimated RPM</th>
  395. {% for plan in detailed_plan.schedule %}
  396. <td>{{plan.actual_rpm|floatformat:"2"}}</td>
  397. {% endfor %}
  398. </tr>
  399. <tr style="background-color:white;color:#3ab98c">
  400. <th style="background-color:#3ab98c;color:white">FOC</th>
  401. {% for plan in detailed_plan.schedule %}
  402. <td>{{plan.foc|floatformat:"2"}}</td>
  403. {% endfor %}
  404. </tr>
  405. <tr style="background-color:white;color:#3ab98c">
  406. <th style="background-color:#3ab98c;color:white">Distance Covered</th>
  407. {% for plan in detailed_plan.schedule %}
  408. <td>{{plan.distance_covered|floatformat:"2"}}</td>
  409. {% endfor %}
  410. </tr>
  411. <tr style="background-color:white;color:#3ab98c">
  412. <th style="background-color:#3ab98c;color:white">Wind Force</th>
  413. {% for plan in detailed_plan.schedule %}
  414. <td>{{plan.wind_force|floatformat:"2"}}</td>
  415. {% endfor %}
  416. </tr>
  417. <tr style="background-color:white;color:#3ab98c">
  418. <th style="background-color:#3ab98c;color:white">Wind Direction</th>
  419. {% for plan in detailed_plan.schedule %}
  420. <td>{{plan.wind_direction|floatformat:"2"}}</td>
  421. {% endfor %}
  422. </tr>
  423. <tr style="background-color:white;color:#3ab98c">
  424. <th style="background-color:#3ab98c;color:white">Current Speed</th>
  425. {% for plan in detailed_plan.schedule %}
  426. <td>{{plan.current_speed|floatformat:"2"}}</td>
  427. {% endfor %}
  428. </tr>
  429. <tr style="background-color:white;color:#3ab98c">
  430. <th style="background-color:#3ab98c;color:white">Current Direction</th>
  431. {% for plan in detailed_plan.schedule %}
  432. <td>{{plan.current_direction|floatformat:"2"}}</td>
  433. {% endfor %}
  434. </tr>
  435. <tr style="background-color:white;color:#3ab98c">
  436. <th style="background-color:#3ab98c;color:white">Wave Height</th>
  437. {% for plan in detailed_plan.schedule %}
  438. <td>{{plan.wave_height|floatformat:"2"}}</td>
  439. {% endfor %}
  440. </tr>
  441. <tr style="background-color:white;color:#3ab98c">
  442. <th style="background-color:#3ab98c;color:white">Wave Direction</th>
  443. {% for plan in detailed_plan.schedule %}
  444. <td>{{plan.wave_direction|floatformat:"2"}}</td>
  445. {% endfor %}
  446. </tr>
  447. <tr style="background-color:white;color:#3ab98c">
  448. <th style="background-color:#3ab98c;color:white">Swell Direction</th>
  449. {% for plan in detailed_plan.schedule %}
  450. <td>{{plan.swell_direction|floatformat:"2"}}</td>
  451. {% endfor %}
  452. </tr>
  453. <tr style="background-color:white;color:#3ab98c">
  454. <th style="background-color:#3ab98c;color:white">Swell height</th>
  455. {% for plan in detailed_plan.schedule %}
  456. <td>{{plan.swell_height|floatformat:"2"}}</td>
  457. {% endfor %}
  458. </tr>
  459.  
  460.  
  461. </table>
  462. </div>
  463. </div>
  464. </div>
  465. </div>
  466. <hr>
  467. <div class="row">
  468. <div class = "col-lg-12">
  469. <div class="panel panel-default">
  470. <div class="panel-heading">
  471. <i class="fa fa-bar-chart-o fa-fw"></i> Speed/Weather
  472. </div>
  473. <!-- /.panel-heading -->
  474. <div class="panel-body">
  475. <div id="container"></div>
  476. </div>
  477. <!-- /.panel-body -->
  478. </div>
  479. </div>
  480. <div class = "col-lg-6">
  481.  
  482. <!-- /.panel -->
  483.  
  484. <!-- /.panel -->
  485.  
  486. <!-- /.col-lg-8 -->
  487.  
  488. </div>
  489. <div class = "col-lg-12">
  490. <div class="panel panel-default">
  491. <div class = "panel-heading"><i class="fa fa-calendar fa-fw"></i> Daily Voyage Schedule</div>
  492. <div class = "panel-body">
  493. <div id="calendar" class = "col-lg-12" ></div>
  494. </div>
  495. </div>
  496. </div>
  497.  
  498. <div class = "col-lg-12">
  499. <button id = "save_plan" class = "btn btn-primary col-lg-12">Save Plan</button>
  500. <hr>
  501. </div>
  502.  
  503.  
  504.  
  505. <script type="text/javascript">
  506.  
  507. var table = $('#plan').DataTable( {
  508. scrollY: "500px",
  509. scrollX: true,
  510. scrollCollapse: true,
  511. paging: false,
  512. ordering: false,
  513. // "aoColumnDefs": [{ 'bSortable': false, 'aTargets': [ 0,7,9 ] }],
  514. "sDom": '<"top"i>rt<"bottom"flp><"clear">'
  515. } );
  516. new $.fn.dataTable.FixedColumns( table );
  517.  
  518.  
  519. $(function () {
  520. actual_speed = [];
  521. actual_rpm = [];
  522. wind_force = [];
  523. sea_current = [];
  524. for(var i = 0; i < formatted_data.length; i++){
  525. actual_speed.push(formatted_data[i].actual_speed);
  526. wind_force.push(formatted_data[i].wind_force);
  527. sea_current.push(formatted_data[i].current_speed);
  528. }
  529. // alert(data);
  530. var sd = moment(formatted_data[0].date.substring(0, 19))
  531. // alert(sd);
  532. $('#container').highcharts({
  533. chart: {
  534. zoomType: 'x'
  535. },
  536. title: {
  537. text: 'Voyage Plan'
  538. },
  539. subtitle: {
  540. text: document.ontouchstart === undefined ?
  541. 'Click and drag in the plot area to zoom in' :
  542. 'Pinch the chart to zoom in'
  543. },
  544. xAxis: {
  545. type: 'datetime',
  546. minRange: 14 * 24 * 3600000 // fourteen days
  547. },
  548. yAxis: [{
  549. title: {
  550. text: 'Current Speed/ Wind Force/ Speed',
  551. // style: {
  552. // color: Highcharts.getOptions().colors[2]
  553. // }
  554. },
  555. labels : {
  556. // style: {
  557. // color: Highcharts.getOptions().colors[0]
  558. // }
  559. }
  560. },
  561. // {
  562. // title: {
  563. // text: 'Wind Force',
  564. // style: {
  565. // color: Highcharts.getOptions().colors[1]
  566. // },
  567. // },
  568.  
  569. // labels : {
  570. // style: {
  571. // color: Highcharts.getOptions().colors[1]
  572. // }
  573. // },
  574.  
  575. // opposite: true
  576. // },
  577.  
  578. ],
  579.  
  580. plotOptions: {
  581. area: {
  582. fillColor: {
  583. // linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1},
  584. // stops: [
  585. // [0, Highcharts.getOptions().colors[0]],
  586. // [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
  587. // ]
  588. },
  589. marker: {
  590. radius: 2
  591. },
  592. lineWidth: 1,
  593. states: {
  594. hover: {
  595. lineWidth: 1
  596. }
  597. },
  598. threshold: null
  599. }
  600. },
  601. tooltip: {
  602. crosshairs: {
  603. color: 'green',
  604. dashStyle: 'solid'
  605. },
  606. shared: true
  607. },
  608.  
  609. series: [{
  610. type: 'line',
  611. name: 'Actual Speed',
  612. pointInterval: 6 * 3600 * 1000,
  613. pointStart: Date.UTC(sd.year(), sd.month(), sd.date()),
  614. data: actual_speed
  615. },
  616.  
  617. {
  618. type: 'line',
  619. name: 'Wind Force',
  620. pointInterval: 6 * 3600 * 1000,
  621. pointStart: Date.UTC(sd.year(), sd.month(), sd.date()),
  622. data: wind_force
  623. },
  624.  
  625. {
  626. type: 'line',
  627. name: 'Sea Current',
  628. pointInterval: 6 * 3600 * 1000,
  629. pointStart: Date.UTC(sd.year(), sd.month(), sd.date()),
  630. data: sea_current
  631. }
  632.  
  633. ]
  634. });
  635.  
  636. });
  637.  
  638. </script>
  639. <!-- /.row -->
  640. {% endblock %}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement