Created
April 22, 2015 07:12
-
-
Save miglen/8554cfbf3b607183999a to your computer and use it in GitHub Desktop.
postbank.location.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Този скрипт е пълен с едни от най-забавните коментари на български. | |
Разработен е от някой от разработчиците на Iliyan.com за Пощенска банка. | |
Пазя го за да се смеем ако го променят в сайта. | |
Оригинална локация: https://www.postbank.bg/Applications/Locations/_inc/js/locations.js | |
*/ | |
/**************************************************************************************/ | |
/**************************************************************************************/ | |
/**************************************************************************************/ | |
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