<?php
/* * *************************************
* Description: Maps (google maps lokacija)
*
* Vprašanje je prisotno:
* tip 26 - lokacija
* podtip 2 - multi lokacija
* podtip 1 - moja lokacija
*
* Autor: Uros Podkriznik
* Created date: 22.04.2016
* *************************************** */
namespace App\Controllers\Vprasanja;
// Osnovni razredi
use App\Controllers\Controller;
use App\Controllers\HelperController as Helper;
use App\Controllers\LanguageController as Language;
use App\Models\Model;
use enkaParameters;
/**
* Description of MapsController
*
* @author uros p.
*/
class MapsController extends Controller {
public function __construct() {
parent::getGlobalVariables();
}
/* * **********************************************
* Get instance
* ********************************************** */
private static $_instance;
public static function getInstance() {
if (self::$_instance)
return self::$_instance;
return new MapsController();
}
public function display($spremenljivka, $oblika) {
global $lang;
$row = Model::select_from_srv_spremenljivka($spremenljivka);
$loop_id = get('loop_id') == null ? " IS NULL" : " = '" . get('loop_id') . "'";
$spremenljivkaParams = new enkaParameters($row['params']);
$podtip = $row['enota'];
//$selected = Model::getOtherValue($spremenljivka);
echo '<div id="spremenljivka_' . $spremenljivka . '_variabla" class="variabla ' . $oblika['cssFloat'] . '">' . "\n";
//get input type - marker, polyline, polygon
$multi_input_type = $spremenljivkaParams->get('multi_input_type');
$map_data = array();
$map_data_info_shapes = array();
//ce je choose location
if($podtip == 3){
$loop_id_3 = "";
//force text to be null from sql
$force_text_null = 'false';
//do we have loop
if(get('loop_id') != null){
//does data for this loop already exist?
$sql1 = sisplet_query("SELECT id FROM srv_data_map WHERE usr_id='" . get('usr_id') .
"' AND spr_id='$spremenljivka' AND loop_id $loop_id", 'array');
//data does not exist, force null on text
if(count($sql1) == 0)
$force_text_null = 'true';
else
$loop_id_3 = " AND dm.loop_id = '" . get('loop_id') . "'";
}
$sql1 = sisplet_query("SELECT vm.vre_id, vm.lat, vm.lng, vm.address, v.naslov, IF($force_text_null, NULL, dm.text) as text FROM srv_vrednost AS v
LEFT JOIN srv_vrednost_map AS vm ON v.id = vm.vre_id
LEFT JOIN srv_data_map AS dm ON v.id = dm.vre_id AND dm.usr_id='" . get('usr_id') . "'
WHERE v.spr_id='$spremenljivka' $loop_id_3", 'array');
//je vec vrednosti
if(!isset($sql1['lat']))
$map_data = $sql1;
//je ena vrednost
else
$map_data[] = $sql1;
//get info shapes
$sql2 = sisplet_query("SELECT lat, lng, address, overlay_id FROM srv_vrednost_map
WHERE spr_id='$spremenljivka' AND overlay_type='polyline' ORDER BY overlay_id, vrstni_red", 'array');
//create json data for info shapes
$st_linij=0;
$last_id=0;
foreach ($sql2 as $line_row) {
if($line_row['overlay_id'] != $last_id){
$st_linij++;
$last_id = $line_row['overlay_id'];
$map_data_info_shapes[$st_linij-1]['overlay_id']=$line_row['overlay_id'];
$map_data_info_shapes[$st_linij-1]['address']=$line_row['address'];
$map_data_info_shapes[$st_linij-1]['path']= array();
}
$path = array();
$path['lat']=floatval($line_row['lat']);
$path['lng']=floatval($line_row['lng']);
array_push($map_data_info_shapes[$st_linij-1]['path'], $path);
}
}
//ce je polygon ali polyline
else if($podtip == 2 && $multi_input_type != '' && $multi_input_type != 'marker'){
//ce so podatki ze v bazi (rec. uporabnik klikne 'Prejsnja stran')
$sql1 = sisplet_query("SELECT lat, lng FROM srv_data_map WHERE spr_id='$spremenljivka' AND usr_id='" . get('usr_id') . "' AND loop_id $loop_id "
. "ORDER BY vrstni_red", 'array');
//if not empty
if(count($sql1)>0){
$map_data = $sql1;
//iterate and convert all coordinates to float - needed for JS
for($i=0; $i<count($map_data); $i++){
$map_data[$i]['lat'] = floatval($map_data[$i]['lat']);
$map_data[$i]['lng'] = floatval($map_data[$i]['lng']);
}
}
}
//ce so markerji
else{
//ce so podatki ze v bazi (rec. uporabnik klikne 'Prejsnja stran')
$sql1 = sisplet_query("SELECT lat, lng, address, text FROM srv_data_map WHERE spr_id='$spremenljivka' AND usr_id='" . get('usr_id') . "' AND loop_id $loop_id "
. "ORDER BY vrstni_red", 'array');
//je vec vrednosti
if(!isset($sql1['lat']))
$map_data = $sql1;
//je ena vrednost
else
$map_data[] = $sql1;
}
//dobi fokus mape
$fokus = $spremenljivkaParams->get('fokus_mape');
//pridobi parametre za centriranje mape in jo nastavi za kasnejso uporabo v js
$fokus_koordinate = $spremenljivkaParams->get('fokus_koordinate'); //dobi fokus koordinat mape
if(!isset(json_decode($fokus_koordinate)->center->lat))
$fokus_koordinate = false;
//dobi max odgovore
$maxmark = $spremenljivkaParams->get('max_markers');
//staro, kasneje sem dodal max_markers - to je zaradi vasjinega workshopa
if($maxmark == '')
$maxmark = $spremenljivkaParams->get('date_range_max');
//dobi user location
$spremenljivkaParams->get('user_location') == 1 ? $userLocation = json_encode(true) :
$userLocation = json_encode(false);
//dobi podvprasanje za marker
$spremenljivkaParams->get('marker_podvprasanje') == 1 ? $podvprasanje = json_encode(true) :
$podvprasanje = json_encode(false);
//dobi naslov podvprasanje za marker
$podvprasanje_naslov = $spremenljivkaParams->get('naslov_podvprasanja_map');
if(!$spremenljivkaParams->get('naslov_podvprasanja_map'))
$podvprasanje_naslov = '';
//ali se prikaze searchbox
$spremenljivkaParams->get('dodaj_searchbox') == 1 ? $dodaj_searchbox = json_encode(true) :
$dodaj_searchbox = json_encode(false);
//ce je tip moja lokacija
if($podtip == 1){
//vkljucijo se funkcije za klik na mapi
$klikNaMapo = json_encode(true);
//vkljuci se iskanje lokacije uporabnika
//$userLocation = json_encode(True);
$mojaLokacija = json_encode(True);
if(!$fokus)
$fokus = "Slovenia";
}
//ce je tip multi lokacija
elseif($podtip == 2){
//vkljuci se iskanje lokacije uporabnika
//$userLocation = json_encode(false);
$mojaLokacija = json_encode(false);
if(!$fokus)
$fokus = "Slovenia";
if($multi_input_type != 'marker'){
$klikNaMapo = json_encode(false);
//izrisi opozorilo o max odgovorov
echo '<div id="end_shape_info_'.$spremenljivka.'" style="display: inline-block; color:red; font-size:0.8em;">'.$lang['srv_resevanje_info_end_shpe_map'].'</div>';
}
else{
//izrisi opozorilo o max odgovorov
echo '<div id="max_marker_'.$spremenljivka.'" style="display: none; color:red; font-size:0.8em;">'.$lang['srv_resevanje_max_marker_opozorilo_map'].'</div>';
//vkljucijo se funkcije za klik na mapi
$klikNaMapo = json_encode(true);
}
}
//ce je podtip izberi lokacijo
elseif($podtip == 3){
//izkljucijo se funkcije za klik na mapi
$klikNaMapo = json_encode(false);
$mojaLokacija = json_encode(false);
}
//ali smo v pregledu izpolnjene ankete? ce da, se v JS nastavi na viewMode=true
$quick_view = json_encode(get('quick_view'));
//disablaj klik na mapo, ce je v quick_view
if(get('quick_view'))
$klikNaMapo = json_encode(false);
//warningi za geolokacijo
echo '<div id="warning_geo_'.$spremenljivka.'" style="display: none; color:orange; font-size:0.8em;"></div>';
//izrisi search box za v mapo
echo '<input id="pac-input_'.$spremenljivka.'" class="pac-input" type="text" onkeypress="return event.keyCode != 13;" style="display: none;">';
//izrisi mapo
echo '<div id="map_'.$spremenljivka.'" style="width:100%;height:300px;border-style: solid;border-width: 1px;border-color: #b4b3b3;"></div>';
?>
<script type="text/javascript">
//zaradi resevanja preko mobilnikov, dodaj ta class, da se iznici top padding (mobile.css)
document.getElementById("spremenljivka_<?php echo $spremenljivka; ?>")
.getElementsByClassName("variable_holder")[0].className += " map_spremenljivka";
//preveri, ce je google API ze loadan (ce se je vedno na novo naloadal, je prislo do errorjev)
if((typeof google === 'object' && typeof google.maps === 'object'))
MapDeclaration();
else{
mapsAPIseNi(MapDeclaration);
}
function MapDeclaration(){
//spremenljivke
var spremenljivka = "<?php echo $spremenljivka; ?>";
//podtip
var podtip = "<?php echo $podtip; ?>";
max_mark[spremenljivka] = "<?php echo $maxmark; ?>";
//je ta spremenljivka tipa moja lokacija?
var mojaLokacija = <?php echo $mojaLokacija; ?>;
//ze ta spremenljivka vsebuje podatke? primer, ce gre uporabnik na prejsnjo stran
var map_data = JSON.parse('<?php echo addslashes(json_encode($map_data)); ?>');
//vsebuje ta spremenljivka F user location (trenutna lokacija)
var doUserLocation = <?php echo $userLocation; ?>;
//ali se izrise podvprasanje v infowindow
podvprasanje[spremenljivka] = <?php echo $podvprasanje; ?>;
//naslov podvprasanja v infowindow
podvprasanje_naslov[spremenljivka] = '<?php echo $podvprasanje_naslov; ?>';
//se naj izvede F klik na mapo (najbrz bo to vedno true)
var doKlikNaMapo = <?php echo $klikNaMapo; ?>;
//smo v pregledu izpolnjene ankete?
viewMode = <?php echo $quick_view; ?>;
//centerInMap = string naslova, kaj bo zajel zemljevid. Rec. Slovenija / ali Ljubljana
var centerInMap = "<?php echo $fokus; ?>";
//get input type - marker, polyline, polygon
var multi_input_type = "<?php echo $multi_input_type; ?>";
//steje markerje (int id spremenljivke: int st markerjev)
st_markerjev[spremenljivka] = 0;
//array of all marksers
allMarkers['<?php echo $spremenljivka; ?>'] = [];
//pridobi parametre za centriranje mape in jo nastavi za kasnejso uporabo
var centerInMapKoordinate = <?php echo json_encode($fokus_koordinate)?>;
if(centerInMapKoordinate)
centerInMapKoordinate = JSON.parse(centerInMapKoordinate);
//ce je spremenljivka tipa moj lokacija, jo shrani v array
if(mojaLokacija)
ml_sprem.push(spremenljivka);
//mapType = tip zemljevida, ki bo prikazan. Recimo za satelitsko sliko google.maps.MapTypeId.SATELLITE (možno še .ROADMAP)
var mapType = google.maps.MapTypeId.ROADMAP;
//Deklaracija potrebnih stvari za delovanje in upravljanje google maps JS API
var mapOptions = {
streetViewControl: false,
navigationControl: false,
mapTypeId: mapType
};
//ce je v bazi naslov enak vpisanemu v nastavitvah, nastavi po parametrih
if(centerInMapKoordinate){
mapOptions.center = {lat: parseFloat(centerInMapKoordinate.center.lat),
lng: parseFloat(centerInMapKoordinate.center.lng)};
mapOptions.zoom = parseInt(centerInMapKoordinate.zoom);
}
//deklaracija geocoderja (API)
if(!geocoder)
geocoder = new google.maps.Geocoder();
//infowindow iz API-ja, za prikaz markerja in informacije o markerju
if(!infowindow)
infowindow = new google.maps.InfoWindow();
//deklaracija zemljevida
var mapdiv = document.getElementById("map_"+spremenljivka);
var map = new google.maps.Map(mapdiv, mapOptions);
//shrani podatke za center v mapo v primeru, ce je spremenljivka hidden
//zaradi loopa, da se lahko ob prikayu ponovno nastavi
map.centerInMap = centerInMap;
map.centerInMapKoordinate = centerInMapKoordinate;
//to se kasneje uporabi za pridobitev mape z id-em spremenljivke
mapdiv.gMap = map;
//deklaracija mej/okvira prikaza na zemljevidu
bounds[spremenljivka] = new google.maps.LatLngBounds();
//ce ze obstajajo markerji ali podatki za mapo, jo nafilaj
if (multi_input_type && multi_input_type != 'marker'){
if(map_data.length > 0)
map_data_fill_shape(spremenljivka, map_data, multi_input_type);
else
drawShape(spremenljivka, null, multi_input_type);
}
else if (map_data.length > 0)
map_data_fill(spremenljivka, map_data, podtip);
//ce ne obstajajo podatki, centriraj mapo na nastavljeno obmocje
else if(!centerInMapKoordinate)
centrirajMap(centerInMap, map);
if(podtip == 3){
//fill info shapes in map if exists
var map_data_info_shapes = JSON.parse('<?php echo addslashes(json_encode($map_data_info_shapes)); ?>');
if (map_data_info_shapes.length > 0)
map_data_fill_info_shapes('<?php echo $spremenljivka; ?>', map_data_info_shapes);
}
//izvedi, ce je nastavljena trenutna lokacija respodenta
if (doUserLocation && map_data.length === 0){
usrLoc_sprem.push(spremenljivka);
userLocation(spremenljivka);
}
//izvedi, ce je nastavljen klik na mapo
if (doKlikNaMapo)
klikNaMapo(spremenljivka);
//izrisi in nastavi search box na zemljevidu
if(<?php echo $dodaj_searchbox; ?>)
searchBox(spremenljivka, function doAfterPlaceFromSearchBox(pos, address){
if(max_mark[spremenljivka]-st_markerjev[spremenljivka] > 0)
createMarker(spremenljivka, address, pos, true);
});
}
</script>
<?php
echo '</div>';
}
}