Skip to content

Instantly share code, notes, and snippets.

@Glamdring
Created April 23, 2015 13:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Glamdring/c7ea210221312bc1abfa to your computer and use it in GitHub Desktop.
Save Glamdring/c7ea210221312bc1abfa to your computer and use it in GitHub Desktop.
Коментари в кода на postbank.bg :)
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
var cnst_city_selected_zoom_level = 17;
function Cacher(url, icon) {
var cnst_dictionary = {
dict_cmd_choose_city:{bg:"Моля изберете град", en:"Please choose city"},
};
var self = this;
var markers = []; //тук ще се пазят всички маркери които съм залепил по картата това е Array от обекти тип {marker:object, JSONData:object} - JSONData се използва за да пазя обекта с даните както е дошъл от сървара.
var isLoaded = false;
var cities = [];
this.infoPanelID; //трябва ми за да си намеря панела при кликане в/у маркера и за да го скролирам до обекта, който е кликнат.
this.map;
this.Cities = function () { return cities; } //ще го напълня в PutMarkers и в него ще седят само градовете, които ще нахаквам в комбото с градовете.
this.url = url;
this.lang = "bg-bg"; //default value
this.icon = icon;
function L(){return self.lang.substring(0, 2).toLowerCase();}
//============================
this.MarkersObjects = function () {return markers;}
//============================
this.PutMarkers = function (callback) {
if (!isLoaded) {//за да не бия постоянно json заявки към сървара, веднъж след като съм го заредил, само крия, показвам! затова ползвам isLoad
cities = [];
$.getJSON(url[L()] + "?d=" + (new Date().getTime()), function (data) {
isLoaded = true;
var counter = 0;
if (!markers.length > 0) //някой вика асинхронно два пъти на onload json ама не мога да го хвана кой. За да оправим проблема проверяваме арея дали е празен и чак тогава стартираме
$.each(data, function (i, e) {
var pos = new google.maps.LatLng(e.lat, e.lng);
var m = new google.maps.Marker({ position: pos, map: self.map, icon: self.icon.icon, shadow: self.icon.shadow, draggable: false });
m["CustomPosition__"] = counter; //използваме малка простотия и си сетваме наш параметър на Google маркера
//onclick marker
google.maps.event.addListener(m, 'click', function () {
var a = $("li div[markerID='" + this["CustomPosition__"] + "']");
a.click();
$("#" + self.infoPanelID).animate({ scrollTop: a[0].offsetTop - 10 }, 600); /*и както се вижда може да си го взема после*/
});
//ondoubleclick marker
google.maps.event.addListener(m, 'dblclick', function () {
if(this.getAnimation() != google.maps.Animation.BOUNCE) //правим чудесии от храброст, защото ondblclick изстрелва и clik, и става една мазня.. затова за гледам дали е отворен ако е .. не го пипам.. ако не е го отварям!
{
var a = $("li div[markerID='" + this["CustomPosition__"] + "']"); a.click();
$("#" + self.infoPanelID).animate({ scrollTop: a[0].offsetTop - 10 }); /*и както се вижда може да си го взема после*/
$("li[markerID='" + this["CustomPosition__"] + "']").find(".items_title_target").click();
}
});
markers.push({ marker: m, JSONData: e/*добавяме си цялата информация за офиса/бранча, за да не търсим после като идиоти в арея който сме изтеглили през json*/ });
if ($.inArray(e.city.toLowerCase(), cities) < 0) {
var ctcfg = CityConfig[L()]; //ей тука събираме информацията от конфига в всеки град който намерим. ако Ники не е дефинирал JS конфига за градовете, то би трябвало тук да е UNDEFINED:)
if (ctcfg && ctcfg[e.city.toLowerCase()]) cities[e.city.toLowerCase()] = { name: e.city.toLowerCase(), order: ctcfg[e.city.toLowerCase()].order, zoom: ctcfg[e.city.toLowerCase()].zoom };
else cities[e.city.toLowerCase()] = { name: e.city.toLowerCase(), order: 200, zoom: 14 };
}
counter++;
})//$.each
if (callback && typeof (callback) === "function") callback(); //извиквам callback за да се знае, че съм свършил. getJSON се изпълнява асинхронно, но ние сме в него и затова тя ще се изпълни след като обработим всичко.
});
} else { //тук просто ще си сменя арейте с които работя и ще изключа маркерите на всички, без този, който е активен/
for (var i = 0; i < markers.length; i++) markers[i].marker.setOptions({ visible: true });
if (callback && typeof (callback) === "function") callback();
} //else
}
this.ClearMarkers = function () {for (var i = 0; i < markers.length; i++) { markers[i].marker.setOptions({ visible: false }); }} //криенето
//==========================
this.getVisibleMarkers = function (_map) {
var ret = [];
for (var i = 0; i < markers.length; i++)
if (_map.getBounds() && _map.getBounds().contains(markers[i].marker.getPosition())) ret.push({pos:i, marker:markers[i]});
//преди да ги върнем, ги сортираме по City
return ret.sort(function (a, b) {
if (a.marker.JSONData.city.toLowerCase() < b.marker.JSONData.city.toLowerCase()) return -1;
if (a.marker.JSONData.city.toLowerCase() > b.marker.JSONData.city.toLowerCase()) return 1;
return 0;
});
} //this.getVisibleMarkers = function
//==========================
}
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
function Locations(_map, _lang, _obj, infoPanelID, MarkerReloadedCallback) {
//тук малко конфиг стрингове
var cnst_dictionary = {
dict_work_time:{bg:"Работно време", en:"Working time"},
dict_work_workdays:{bg:"От понеделник до петък", en:"Monday to Friday"},
dict_work_saturday:{bg:"Събота", en:"Saturday"},
dict_work_sunday: { bg: "Неделя", en: "Sunday" },
dict_phone: { bg: "Телефон:", en: "Phone:" },
dict_cmd_zoom_city:{bg:"Вижте град", en:"Zoom city"},
dict_cmd_zoom_item:{bg:"Увеличи на картата", en:"Zoom object on map"}
};
//тук малко конфиг стрингове свършват
var map = _map, map_old_zoom, map_old_center;
var maxBounds = map.getBounds(), maxCenter=map.getCenter(), maxZoom = map.getZoom(); //Ще пазим това за да можем да лимитираме клиента рамките на картата - това би трябвало да са инициализационните стойности
var lang = _lang;
var obj = _obj;
for (var obb in _obj) { _obj[obb].lang = _lang;_obj[obb].infoPanelID = infoPanelID; _obj[obb].map = _map;} //извъртам всички арея с всички вътрешни обекти, за да им залепя lang и infoPanelID
google.maps.event.addListener(map, 'bounds_changed', _SetInfoPanel);
var panel = "#"+infoPanelID;
var radios = keys(obj), //въртя из арея с обекти за да си генерирам ID на радио бутините в последствие, и да ги търся.
currentObjectsList,
_MarkerReloadedCallback = MarkerReloadedCallback;
//=======================================================
this.CurrentObject = function () { return currentObjectsList; };
function L() { return lang.substring(0, 2).toLowerCase(); };
//=======================================================
function keys(who) {
var keys = [];
for (var k in who)
if (who.hasOwnProperty(k)) {keys.push(k);}
return keys;
};
//=======================================================
this.pickMarker = function (i) {
var mrkrs = currentObjectsList.MarkersObjects();
for (var c = 0; c < mrkrs.length; c++) {
var mrkr = mrkrs[c].marker;
if (c == i) { //namerili sme markera
if (mrkr.getAnimation() != google.maps.Animation.BOUNCE) //и сега ако скача го спираме, ако е спрял го пускаме да скача
{ mrkr.setAnimation(google.maps.Animation.BOUNCE); }
else { mrkr.setAnimation(null); }
} else {
if (mrkr.getAnimation() == google.maps.Animation.BOUNCE) mrkr.setAnimation(null); //не изключвам всички маркери, за да не ми примигва кофти.
}
}
//map.setCenter(mrkr.getPosition())
}
//=======================================================
this.togle = function (who, callback) {
var r = $(who).children("[type=radio]"); //запазваме си този, който е кликнат.
for (var i = 0; i < radios.length; i++) { //след това извъртаме всички за да им угасим маркерите!
var keyName = radios[i],
curr = $("#" + keyName);
if (curr.attr("id") == r.attr("id")) {//tuk sme w radioto, koeto sme kliknali
curr.attr("checked", true); currentObjectsList = obj[keyName];
} else { //tuk във всички останали
curr.attr("checked", false); obj[keyName].ClearMarkers();
}
} //for
currentObjectsList.PutMarkers(this.markersReloaded);
} //this.togle = function (who)
//=====================================================
//Тук се генерира HTML за info_panel
function generateInfoHTML(_visibleMarkers) {
var bfr = [];
//now put bulgaria
bfr.push("<ul>");
var oldCity = "----", citiesInPane = 0;
for (var i = 0; i < _visibleMarkers.length; i++) {
var cssSelected="";
var currMarker = _visibleMarkers[i].marker;
if (currMarker.marker.getAnimation() == google.maps.Animation.BOUNCE) cssSelected = "selected";
if (oldCity.toLowerCase() != currMarker.JSONData.city.toLowerCase()) { //малко игра за да сложим при всеки нов град H1 - арея с маркерите е сортиран по градове ;)
bfr.push("<H1><a title='" +cnst_dictionary.dict_cmd_zoom_city[L()]+ "' onclick=\"$('#cityselect').val('" +currMarker.JSONData.city+ "').trigger('chosen:updated').change();\">" + currMarker.JSONData.city + "</a></H1>");
oldCity = currMarker.JSONData.city;
citiesInPane++; //боим си колко градове има в пането.!
}
bfr.push("<li class='" + cssSelected + "' markerID='" + _visibleMarkers[i].pos + "'>");
bfr.push("<span class='items_title_buttons'>");
bfr.push("<a class='items_title_city' onclick=\"$('#cityselect').val('" +currMarker.JSONData.city+ "').trigger('chosen:updated').change();\" title='" +cnst_dictionary.dict_cmd_zoom_city[L()]+ "'></a>");
bfr.push("<a title='" +cnst_dictionary.dict_cmd_zoom_item[L()]+ "' class='items_title_target' onclick='zoomTo(new google.maps.LatLng(" + currMarker.JSONData.lat + "," + currMarker.JSONData.lng + "), " +cnst_city_selected_zoom_level+ ");'></a>");
bfr.push("</span>");
bfr.push("<div class='city_item " + cssSelected + "' markerID='" + _visibleMarkers[i].pos + "' onclick=\"if(typeof eval(locationPicked) == 'function') locationPicked(" + _visibleMarkers[i].pos + "); $('.city_item').not(this).removeClass('selected').parent().removeClass('selected').find('.items_details').slideUp(400);$(this).toggleClass('selected'); $(this).parent().toggleClass('selected'); $(this).find('.items_details').slideToggle(400);\"' >");
bfr.push("<a class='items_title " + currMarker.JSONData.type.toLowerCase() + "' >" + currMarker.JSONData.Name + "</a>");
if(currMarker.marker.getAnimation() == google.maps.Animation.BOUNCE){ //ако маркера е бил селектнат и подскача, ще го оставиме разтегнат!
bfr.push("<div class='items_details' style='display:inline-block'>");
}
else { bfr.push("<div class='items_details' style='display:none'>"); }
bfr.push("<div class='it_address'>" + currMarker.JSONData.address + "</div>");
if ( currMarker.JSONData.workTime/* &&
(currMarker.JSONData.workTime.workDays.to || currMarker.JSONData.workTime.workDays.from) &&
(currMarker.JSONData.workTime.workSaturday.to || currMarker.JSONData.workTime.workSaturday.from) &&
(currMarker.JSONData.workTime.workSunday.to || currMarker.JSONData.workTime.workSunday.from)*/
) {
bfr.push("<div class='working_time'>");
bfr.push("<div class='it_working_time_title'>" + cnst_dictionary.dict_work_time[L()] + "</div>");
if (currMarker.JSONData.workTime.workDays.to || currMarker.JSONData.workTime.workDays.from) bfr.push("<div class='working_time_item mon'><label>" + cnst_dictionary.dict_work_workdays[L()] + "</label>" + currMarker.JSONData.workTime.workDays.from + " - " + currMarker.JSONData.workTime.workDays.to + "</div>");
if (currMarker.JSONData.workTime.workSaturday.isWorking) bfr.push("<div class='working_time_item sat'><label>" + cnst_dictionary.dict_work_saturday[L()] + "</label>" + currMarker.JSONData.workTime.workSaturday.from + " - " + currMarker.JSONData.workTime.workSaturday.to + "</div>");
if (currMarker.JSONData.workTime.workSunday.isWorking) bfr.push("<div class='working_time_item sun'><label>" + cnst_dictionary.dict_work_sunday[L()] + "</label>" + currMarker.JSONData.workTime.workSunday.from + " - " + currMarker.JSONData.workTime.workSunday.to + "</div>");
bfr.push("</div>")
}
/*fc, id, lat,lng,Name,type, phone*/
if (currMarker.JSONData.phone)
bfr.push("<div class='phone'><label>" + cnst_dictionary.dict_phone[L()] + "</label>" + currMarker.JSONData.phone + "</div>");
bfr.push("</div>");
bfr.push("</div>");
bfr.push("</li>");
}
bfr.push("</ul>");
if(citiesInPane ==0 || citiesInPane >1) $('#cityselect').val('').trigger('chosen:updated');//ako nqmame grad, ili imame poweche ot edin grad ще направим комбото да няма избран град ;)
else $('#cityselect').val(oldCity).trigger('chosen:updated'); //ако е само един град, го избираме в комбото.
return bfr.join("");
}
//=====================================================
this.SetInfoPanel = function () {
_SetInfoPanel();
}
//=====================================================
function _SetInfoPanel() {
if(!self.maxBounds){ self.maxBounds = map.getBounds(); self.maxZoom = map.getZoom();self.maxCenter=map.getCenter();}//т.к картата не е ясно кога става готова, то ако е ! ot undefined си го сетваме макс и разчитаме, че повече няма да го променяме.
window.status = "map-zoom-level:" + map.getZoom();
if(self.maxBounds &&
(!self.maxBounds.contains(map.getBounds().getSouthWest()) ||
!self.maxBounds.contains(map.getBounds().getNorthEast()))
) {
if(map.getZoom() == self.maxZoom) //ако някой е по границата и се опитва да zoom -out не още... но на практика излиза от видимото пространство то ще го позиционираме на началното зареждане
zoomTo(self.maxCenter, self.maxZoom);
else zoomTo(map_old_center, map_old_zoom);
}
else
{
var vsblMarkers = currentObjectsList.getVisibleMarkers(map);
$(panel).html(generateInfoHTML(vsblMarkers)).show();
map_old_zoom = map.getZoom(); map_old_center = map.getCenter();
}
//$(panel).mCustomScrollbar('update');
}
//=====================================================
this.markersReloaded = function () {
_SetInfoPanel();
if (_MarkerReloadedCallback && typeof (_MarkerReloadedCallback) === "function") _MarkerReloadedCallback(currentObjectsList, L());
};
//=====================================================
} //function Locations
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
/**************************************************************************************/
function initCities(who, lng) {
var choose = "Моля изберете град...";
if(lng=="en") choose = "Please choose city..."
//проблема, е че Cities e асоциативен арей (демек Dictionary) и не можем да го сортираме...затова Ще го прехвърлим в арей в арей ;)
var tuples = [];
for (var val in who.Cities()) tuples.push([val, who.Cities()[val]]);
//и след това ще го сортираме като попове!
tuples.sort(function (a, b) {
a = a[1].name.toLowerCase(); b = b[1].name.toLowerCase();
return a < b ? -1 : (a > b ? 1 : 0); //първо по име
})
.sort(function (a, b) {
a = a[1].order; b = b[1].order;
return a < b ? -1 : (a > b ? 1 : 0);
}); //след това по ордер!
//хайде най-накрая да направим комбото!
var s = $("#cityselect"); s.empty();
$('<option />', { value: "", text: choose }).appendTo(s);
for (var i = 0; i < tuples.length; i++ ) {
var ct = tuples[i][1].name;
ct = ct.charAt(0).toUpperCase() + ct.slice(1);
$('<option mapZoomLevel="'+ tuples[i][1].zoom + '">' + ct + "</option>").appendTo(s);
}
//хайде сега да го направим търсещо..
//и сега ако е дошъл QRY string
var vc = getParameterByName("c").toLowerCase();
if (vc.length > 2 && vc.length < 20)
{
var opt = s.find("option").filter(function () { return $(this).text().toLowerCase() === vc.toLowerCase(); }); //хващаме го case insensitive po text!
if (opt.length > 0) { //ако сме хванали някой град, направо шием SetFocus
s.val(vc.charAt(0).toUpperCase() + vc.slice(1)); //е естествено сетваме и комбото ;)
SetFocusToCity(vc, opt.first().attr("mapZoomLevel")); //да не забравяме и да викнем функцията за позициониране на картата.
}
}
s.chosen({ disable_search_threshold: 10, placeholder_text_single: choose }); //и тук най-нагло си го правим търсещо ;)
}
//==================================================================================
function locationPicked(i) {
top.locations.pickMarker(i);
}
//==================================================================================
function map_initialize(who) {
//infowindow = new google.maps.InfoWindow({ content: "Object..." });
// инициализиране на картата
var styles = [ { stylers: [ { hue: "#004357" }, { saturation: 0 } ] },{ featureType: "road", elementType: "geometry", stylers: [ { lightness: 5 }, { visibility: "simplified" } ] } /*,{ featureType: "administrative", elementType: "labels", stylers: [ { color: "#FF0000", weight:"3px" } ] } */];
var map = new google.maps.Map(document.getElementById(who), {
mapTypeControlOptions: {
mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID]
},
zoom: 7,
center: new google.maps.LatLng(42.7500, 25.5000),
// styles:styles,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
return map;
}
//==================================================================================
function zoomTo(who, zoom) {
map.setCenter(who);
map.setZoom(zoom);
}
//==================================================================================
// DDL onchange function
function SetFocusToCity(cityName, zoom) {
var geocoder = new google.maps.Geocoder();
var country = 'България,';
var city = cityName;
var ind_city = jQuery('#cityselect').val();
if (ind_city.length > 0) {
var address = country + city;
//geocoder.geocode({ address: address }, focusPoint);
geocoder.geocode( { 'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
map.setZoom(zoom*1);
//var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location });
} else {
}
});
}
else {
// nocity selected
var Abs_center_position = new google.maps.LatLng(42.7500, 25.5000);
map.setCenter(Abs_center_position);
map.setZoom(7);
}
} // function
//==================================================================================
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
//==================================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment