|  |  | 
 |  |  | <!DOCTYPE HTML> | 
 |  |  | <html> | 
 |  |  | <head> | 
 |  |  | <title>OpenLayers Demo</title> | 
 |  |  | <title>MPK Kraków Map</title> | 
 |  |  | <style type="text/css"> | 
 |  |  | html, body, #map { | 
 |  |  |    width: 100%; | 
 |  |  |    height: 100%; | 
 |  |  |    margin: 0; | 
 |  |  | } | 
 |  |  | #popup { | 
 |  |  |    color: black; | 
 |  |  |    background: white; | 
 |  |  |    padding: 5px; | 
 |  |  |    border: 1px solid black; | 
 |  |  |    border-radius: 10px; | 
 |  |  |    font: 12px sans-serif; | 
 |  |  | } | 
 |  |  | #popup p { | 
 |  |  |    margin: 0; | 
 |  |  |    padding: 5px; | 
 |  |  | } | 
 |  |  | #popup .line-direction { | 
 |  |  |    font-weight: bold; | 
 |  |  | } | 
 |  |  | </style> | 
 |  |  | <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7"  crossorigin="anonymous"></script> | 
 |  |  | <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script> | 
 |  |  | <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList"></script> | 
 |  |  | <script src="https://openlayers.org/en/v4.0.1/build/ol.js" type="text/javascript"></script> | 
 |  |  | <script src="https://openlayers.org/en/v4.0.1/build/ol.js" integrity="sha384-DjqoiOTAYD0bxdY6K1Ep7Xd4QQc46AKzKmkgC4+rnKX47PniPHIjRt02uhT8C04h" crossorigin="anonymous"></script> | 
 |  |  | <script tyle="text/javascript" src="lang_en.js" id="lang_script"></script> | 
 |  |  | <script tyle="text/javascript" src="common.js"></script> | 
 |  |  | </head> | 
 |  |  | <body> | 
 |  |  | <div id="map"><div id="popup"></div></div> | 
 |  |  | 
 |  |  | var vehicles_source = null; | 
 |  |  | var vehicles_xhr = null; | 
 |  |  | var vehicles_timer = null; | 
 |  |  | var vehicles_last_update = 0; | 
 |  |  |  | 
 |  |  | var map = null; | 
 |  |  | var popup_feature_id = null; | 
 |  |  | var popup_element = document.getElementById('popup'); | 
 |  |  | var popup = null; | 
 |  |  |  | 
 |  |  | 
 |  |  |       element: popup_element, | 
 |  |  |       positioning: 'bottom-center', | 
 |  |  |       stopEvent: false, | 
 |  |  |       offset: [0, -50] | 
 |  |  |       offset: [0, -12] | 
 |  |  |    }); | 
 |  |  |     | 
 |  |  |    map = new ol.Map({ | 
 |  |  | 
 |  |  |    // display popup on click | 
 |  |  |    map.on('singleclick', function(evt) { | 
 |  |  |       var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature) { return feature; }); | 
 |  |  |       if (feature) { | 
 |  |  |       if(feature) { | 
 |  |  |          var coordinates = feature.getGeometry().getCoordinates(); | 
 |  |  |          popup_element.innerHtml = feature.name; | 
 |  |  | 			 | 
 |  |  |          deleteChildren(popup_element); | 
 |  |  |          addParaWithText(popup_element, feature.get('name')).className = 'line-direction'; | 
 |  |  | 			 | 
 |  |  |          var vehicle_type = parseVehicle(feature.get('id')); | 
 |  |  |          if(vehicle_type) { | 
 |  |  |             addParaWithText(popup_element, vehicle_type.num + ' ' + vehicle_type.type); | 
 |  |  |          } | 
 |  |  | 			 | 
 |  |  |          popup.setPosition(coordinates); | 
 |  |  |          popup_feature_id = feature.getId(); | 
 |  |  |       } else { | 
 |  |  |          popup.setPosition(undefined); | 
 |  |  |          popup_feature_id = null; | 
 |  |  |       } | 
 |  |  |    }); | 
 |  |  |  | 
 |  |  | 
 |  |  |       ttss_base + '/geoserviceDispatcher/services/vehicleinfo/vehicles'  | 
 |  |  |          + '?positionType=CORRECTED' | 
 |  |  |          + '&colorType=ROUTE_BASED' | 
 |  |  |          + '&lastUpdate=' + encodeURIComponent(vehicles_last_update) | 
 |  |  |    ).done(function(data) { | 
 |  |  |       vehicles_last_update = data.lastUpdate; | 
 |  |  | 		 | 
 |  |  |       for(var i = 0; i < data.vehicles.length; i++) { | 
 |  |  |          var vehicle = data.vehicles[i]; | 
 |  |  |           | 
 |  |  | 
 |  |  |          var vehicle_name_space = vehicle.name.indexOf(' '); | 
 |  |  |          vehicle.line = vehicle.name.substr(0, vehicle_name_space); | 
 |  |  |          vehicle.direction = vehicle.name.substr(vehicle_name_space+1); | 
 |  |  |          if(special_directions[vehicle.direction]) { | 
 |  |  |             vehicle.line = special_directions[vehicle.direction]; | 
 |  |  |          } | 
 |  |  | 			 | 
 |  |  |          vehicle.geometry = new ol.geom.Point(ol.proj.fromLonLat([vehicle.longitude / 3600000.0, vehicle.latitude / 3600000.0])); | 
 |  |  |          vehicle.vehicle_type = parseVehicle(vehicle.id); | 
 |  |  |           | 
 |  |  |          if(!vehicle_feature) { | 
 |  |  |             vehicle_feature = new ol.Feature(vehicle); | 
 |  |  |             vehicle_feature.setId(vehicle.id); | 
 |  |  | 				 | 
 |  |  |             var color_type = 'black'; | 
 |  |  |             if(vehicle.vehicle_type) { | 
 |  |  |                switch(vehicle.vehicle_type.low) { | 
 |  |  |                   case 0: | 
 |  |  |                      color_type = 'orange'; | 
 |  |  |                      break; | 
 |  |  |                   case 1: | 
 |  |  |                      color_type = 'blue'; | 
 |  |  |                      break; | 
 |  |  |                   case 2: | 
 |  |  |                      color_type = 'green'; | 
 |  |  |                      break; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  | 				 | 
 |  |  |             vehicle_feature.setStyle(new ol.style.Style({ | 
 |  |  |                image: new ol.style.RegularShape({ | 
 |  |  |                   fill: new ol.style.Fill({color: '#3399ff'}), | 
 |  |  |                   stroke: new ol.style.Stroke({color: 'black', width: 1}), | 
 |  |  |                   stroke: new ol.style.Stroke({color: color_type, width: 2}), | 
 |  |  |                   points: 3, | 
 |  |  |                   radius: 12, | 
 |  |  |                   rotation: Math.PI * 2.0 * vehicle.heading / 360.0, | 
 |  |  |                   angle: 0 | 
 |  |  |                }), | 
 |  |  |                text: new ol.style.Text({ | 
 |  |  |                   font: 'bold 10px sans-serif', | 
 |  |  |                   text: vehicle.line, | 
 |  |  |                   fill: new ol.style.Fill({color: 'white'}), | 
 |  |  |                }), | 
 |  |  | 
 |  |  |             vehicles_source.addFeature(vehicle_feature); | 
 |  |  |          } else { | 
 |  |  |             vehicle_feature.setProperties(vehicle); | 
 |  |  |             if(popup_feature_id == vehicle.id) { | 
 |  |  |                popup.setPosition(vehicle_feature.getGeometry().getCoordinates()); | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |        |