Venciity

Коментари в кода

Apr 23rd, 2015
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**************************************************************************************/
  2. /**************************************************************************************/
  3. /**************************************************************************************/
  4. var cnst_city_selected_zoom_level = 17;
  5. function Cacher(url, icon) {
  6.    
  7.    var cnst_dictionary = {
  8.         dict_cmd_choose_city:{bg:"Моля изберете град", en:"Please choose city"},
  9.     };
  10.     var self = this;
  11.     var markers = []; //тук ще се пазят всички маркери които съм залепил по картата това е Array от обекти тип {marker:object, JSONData:object} - JSONData се използва за да пазя обекта с даните както е дошъл от сървара.
  12.     var isLoaded = false;
  13.     var cities = [];
  14.     this.infoPanelID; //трябва ми за да си намеря панела при кликане в/у маркера и за да го скролирам до обекта, който е кликнат.
  15.     this.map;
  16.     this.Cities = function () { return cities; } //ще го напълня в PutMarkers и в него ще седят само градовете, които ще нахаквам в комбото с градовете.
  17.     this.url = url;
  18.     this.lang = "bg-bg"; //default value
  19.     this.icon = icon;
  20.     function L(){return self.lang.substring(0, 2).toLowerCase();}
  21.     //============================
  22.     this.MarkersObjects = function () {return markers;}
  23.     //============================
  24.     this.PutMarkers = function (callback) {
  25.         if (!isLoaded) {//за да не бия постоянно json заявки към сървара, веднъж след като съм го заредил, само крия, показвам! затова ползвам isLoad
  26.             cities = [];
  27.            
  28.             $.getJSON(url[L()] + "?d=" + (new Date().getTime()), function (data) {
  29.                 isLoaded = true;
  30.                 var counter = 0;
  31.                 if (!markers.length > 0) //някой вика асинхронно два пъти на onload json ама не мога да го хвана кой. За да оправим проблема проверяваме арея дали е празен и чак тогава стартираме
  32.                     $.each(data, function (i, e) {
  33.                         var pos = new google.maps.LatLng(e.lat, e.lng);
  34.                         var m = new google.maps.Marker({ position: pos, map: self.map, icon: self.icon.icon, shadow: self.icon.shadow, draggable: false });
  35.                         m["CustomPosition__"] = counter; //използваме малка простотия и си сетваме наш параметър на Google маркера
  36.                         //onclick marker
  37.                         google.maps.event.addListener(m, 'click', function () {
  38.                             var a = $("li div[markerID='" + this["CustomPosition__"] + "']");
  39.                             a.click();
  40.                             $("#" + self.infoPanelID).animate({ scrollTop: a[0].offsetTop - 10 }, 600);  /*и както се вижда може да си го взема после*/
  41.                         });
  42.                         //ondoubleclick marker
  43.                         google.maps.event.addListener(m, 'dblclick', function () {
  44.                             if(this.getAnimation() != google.maps.Animation.BOUNCE) //правим чудесии от храброст, защото ondblclick изстрелва и clik, и става една мазня.. затова за гледам дали е отворен ако е .. не го пипам.. ако не е го отварям!
  45.                             {
  46.                                 var a = $("li div[markerID='" + this["CustomPosition__"] + "']"); a.click();
  47.                                     $("#" + self.infoPanelID).animate({ scrollTop: a[0].offsetTop - 10 });  /*и както се вижда може да си го взема после*/
  48.                                 $("li[markerID='" + this["CustomPosition__"] + "']").find(".items_title_target").click();
  49.                             }
  50.                             });
  51.  
  52.                         markers.push({ marker: m, JSONData: e/*добавяме си цялата информация за офиса/бранча, за да не търсим после като идиоти в арея който сме изтеглили през json*/ });
  53.                         if ($.inArray(e.city.toLowerCase(), cities) < 0) {
  54.                             var ctcfg = CityConfig[L()]; //ей тука събираме информацията от конфига в всеки град който намерим. ако Ники не е дефинирал JS конфига за градовете, то би трябвало тук да е UNDEFINED:)
  55.                             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 };
  56.                              else cities[e.city.toLowerCase()] = { name: e.city.toLowerCase(), order: 200, zoom: 14 };
  57.                         }
  58.                         counter++;
  59.                     })//$.each
  60.                 if (callback && typeof (callback) === "function") callback(); //извиквам callback за да се знае, че съм свършил. getJSON се изпълнява асинхронно, но ние сме в него и затова тя ще се изпълни след като обработим всичко.
  61.             });
  62.         } else { //тук просто ще си сменя арейте с които работя и ще изключа маркерите на всички, без този, който е активен/
  63.             for (var i = 0; i < markers.length; i++) markers[i].marker.setOptions({ visible: true });
  64.             if (callback && typeof (callback) === "function") callback();
  65.         } //else
  66.     }
  67.     this.ClearMarkers = function () {for (var i = 0; i < markers.length; i++) { markers[i].marker.setOptions({ visible: false }); }} //криенето
  68.     //==========================
  69.     this.getVisibleMarkers = function (_map) {
  70.         var ret = [];
  71.         for (var i = 0; i < markers.length; i++)
  72.             if (_map.getBounds() && _map.getBounds().contains(markers[i].marker.getPosition())) ret.push({pos:i, marker:markers[i]});
  73.         //преди да ги върнем, ги сортираме по City
  74.         return ret.sort(function (a, b) {
  75.             if (a.marker.JSONData.city.toLowerCase() < b.marker.JSONData.city.toLowerCase()) return -1;
  76.             if (a.marker.JSONData.city.toLowerCase() > b.marker.JSONData.city.toLowerCase()) return 1;
  77.             return 0;
  78.         });
  79.        
  80.     }    //this.getVisibleMarkers = function
  81.     //==========================
  82. }
  83. /**************************************************************************************/
  84. /**************************************************************************************/
  85. /**************************************************************************************/
  86. /**************************************************************************************/
  87. /**************************************************************************************/
  88. function Locations(_map, _lang, _obj, infoPanelID, MarkerReloadedCallback) {
  89.     //тук малко конфиг стрингове
  90.     var cnst_dictionary = {
  91.         dict_work_time:{bg:"Работно време", en:"Working time"},
  92.         dict_work_workdays:{bg:"От понеделник до петък", en:"Monday to Friday"},
  93.         dict_work_saturday:{bg:"Събота", en:"Saturday"},
  94.         dict_work_sunday: { bg: "Неделя", en: "Sunday" },
  95.         dict_phone: { bg: "Телефон:", en: "Phone:" },
  96.     dict_cmd_zoom_city:{bg:"Вижте град", en:"Zoom city"},
  97.         dict_cmd_zoom_item:{bg:"Увеличи на картата", en:"Zoom object on map"}
  98.     };
  99.     //тук малко конфиг стрингове свършват
  100.     var map = _map, map_old_zoom, map_old_center;
  101.     var maxBounds = map.getBounds(), maxCenter=map.getCenter(), maxZoom = map.getZoom(); //Ще пазим това за да можем да лимитираме клиента рамките на картата - това би трябвало да са инициализационните стойности
  102.     var lang = _lang;
  103.     var obj = _obj;
  104.     for (var obb in _obj) { _obj[obb].lang = _lang;_obj[obb].infoPanelID = infoPanelID;  _obj[obb].map = _map;} //извъртам всички арея с всички вътрешни обекти, за да им залепя lang и infoPanelID
  105.     google.maps.event.addListener(map, 'bounds_changed', _SetInfoPanel);
  106.     var panel = "#"+infoPanelID;
  107.     var radios = keys(obj), //въртя из арея с обекти за да си генерирам ID на радио бутините в последствие, и да ги търся.
  108.     currentObjectsList,
  109.     _MarkerReloadedCallback = MarkerReloadedCallback;
  110.    
  111.     //=======================================================
  112.     this.CurrentObject = function () { return currentObjectsList; };
  113.     function L() { return lang.substring(0, 2).toLowerCase(); };
  114.     //=======================================================
  115.     function keys(who) {
  116.         var keys = [];
  117.         for (var k in who)
  118.             if (who.hasOwnProperty(k)) {keys.push(k);}
  119.         return keys;
  120.     };
  121.     //=======================================================
  122.     this.pickMarker = function (i) {
  123.         var mrkrs = currentObjectsList.MarkersObjects();
  124.  
  125.         for (var c = 0; c < mrkrs.length; c++) {
  126.             var mrkr = mrkrs[c].marker;
  127.             if (c == i) { //namerili sme markera
  128.                 if (mrkr.getAnimation() != google.maps.Animation.BOUNCE) //и сега ако скача го спираме, ако е спрял го пускаме да скача
  129.                 { mrkr.setAnimation(google.maps.Animation.BOUNCE); }
  130.                 else { mrkr.setAnimation(null); }
  131.             } else {
  132.                 if (mrkr.getAnimation() == google.maps.Animation.BOUNCE)  mrkr.setAnimation(null); //не изключвам всички маркери, за да не ми примигва кофти.
  133.             }
  134.         }
  135.  
  136.         //map.setCenter(mrkr.getPosition())
  137.  
  138.     }
  139.     //=======================================================
  140.     this.togle = function (who, callback) {
  141.         var r = $(who).children("[type=radio]"); //запазваме си този, който е кликнат.
  142.         for (var i = 0; i < radios.length; i++) { //след това извъртаме всички за да им угасим маркерите!
  143.             var keyName = radios[i],
  144.                 curr = $("#" + keyName);
  145.             if (curr.attr("id") == r.attr("id")) {//tuk sme w radioto, koeto sme kliknali
  146.                 curr.attr("checked", true); currentObjectsList = obj[keyName];
  147.             } else { //tuk във всички останали
  148.                 curr.attr("checked", false); obj[keyName].ClearMarkers();
  149.             }
  150.         } //for
  151.         currentObjectsList.PutMarkers(this.markersReloaded);
  152.     }    //this.togle = function (who)
  153.     //=====================================================
  154.     //Тук се генерира HTML за info_panel
  155.     function generateInfoHTML(_visibleMarkers) {
  156.         var bfr = [];
  157.         //now put bulgaria
  158.        
  159.         bfr.push("<ul>");
  160.         var oldCity = "----", citiesInPane = 0;
  161.         for (var i = 0; i < _visibleMarkers.length; i++) {
  162.             var cssSelected="";
  163.             var currMarker = _visibleMarkers[i].marker;
  164.             if (currMarker.marker.getAnimation() == google.maps.Animation.BOUNCE) cssSelected = "selected";
  165.  
  166.             if (oldCity.toLowerCase() != currMarker.JSONData.city.toLowerCase()) { //малко игра за да сложим при всеки нов град H1 - арея с маркерите е сортиран по градове ;)
  167.                 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>");
  168.                 oldCity = currMarker.JSONData.city;
  169.                 citiesInPane++; //боим си колко градове има в пането.!
  170.             }
  171.  
  172.  
  173.             bfr.push("<li class='" + cssSelected + "' markerID='" + _visibleMarkers[i].pos + "'>");
  174.             bfr.push("<span class='items_title_buttons'>");
  175.             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>");
  176.             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>");
  177.             bfr.push("</span>");
  178.             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);\"' >");
  179.             bfr.push("<a class='items_title " + currMarker.JSONData.type.toLowerCase() + "' >" + currMarker.JSONData.Name + "</a>");
  180.             if(currMarker.marker.getAnimation() == google.maps.Animation.BOUNCE){ //ако маркера е бил селектнат и подскача, ще го оставиме разтегнат!
  181.                 bfr.push("<div class='items_details' style='display:inline-block'>");
  182.             }
  183.             else { bfr.push("<div class='items_details' style='display:none'>"); }
  184.  
  185.             bfr.push("<div class='it_address'>" + currMarker.JSONData.address + "</div>");
  186.  
  187.  
  188.             if ( currMarker.JSONData.workTime/* &&
  189.                 (currMarker.JSONData.workTime.workDays.to || currMarker.JSONData.workTime.workDays.from) &&
  190.                 (currMarker.JSONData.workTime.workSaturday.to || currMarker.JSONData.workTime.workSaturday.from) &&
  191.                 (currMarker.JSONData.workTime.workSunday.to || currMarker.JSONData.workTime.workSunday.from)*/
  192.             ) {
  193.                 bfr.push("<div class='working_time'>");
  194.                 bfr.push("<div class='it_working_time_title'>" + cnst_dictionary.dict_work_time[L()] + "</div>");
  195.                 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>");
  196.                 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>");
  197.                 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>");
  198.                 bfr.push("</div>")
  199.             }
  200.             /*fc, id, lat,lng,Name,type, phone*/
  201.             if (currMarker.JSONData.phone)
  202.                 bfr.push("<div class='phone'><label>" + cnst_dictionary.dict_phone[L()] + "</label>" + currMarker.JSONData.phone + "</div>");
  203.             bfr.push("</div>");
  204.             bfr.push("</div>");
  205.             bfr.push("</li>");
  206.         }
  207.         bfr.push("</ul>");
  208.         if(citiesInPane ==0  || citiesInPane >1)  $('#cityselect').val('').trigger('chosen:updated');//ako nqmame grad, ili imame poweche ot edin grad ще направим комбото да няма избран град ;)
  209.     else $('#cityselect').val(oldCity).trigger('chosen:updated'); //ако е само един град, го избираме в комбото.
  210.         return bfr.join("");
  211.     }
  212.     //=====================================================
  213.     this.SetInfoPanel = function () {
  214.         _SetInfoPanel();
  215.         }
  216.     //=====================================================
  217.     function _SetInfoPanel() {
  218.         if(!self.maxBounds){ self.maxBounds = map.getBounds(); self.maxZoom = map.getZoom();self.maxCenter=map.getCenter();}//т.к картата не е ясно кога става готова, то ако е ! ot undefined си го сетваме макс и разчитаме, че повече няма да го променяме.
  219.  
  220.         window.status = "map-zoom-level:" + map.getZoom();
  221.         if(self.maxBounds &&
  222.             (!self.maxBounds.contains(map.getBounds().getSouthWest()) ||
  223.             !self.maxBounds.contains(map.getBounds().getNorthEast()))
  224.         ) {
  225.             if(map.getZoom() == self.maxZoom) //ако някой е по границата и се опитва да zoom -out не още... но на практика излиза от видимото пространство то ще го позиционираме на началното зареждане
  226.             zoomTo(self.maxCenter, self.maxZoom);
  227.             else zoomTo(map_old_center, map_old_zoom);
  228.            
  229.           }
  230.     else
  231.     {
  232.             var vsblMarkers = currentObjectsList.getVisibleMarkers(map);
  233.             $(panel).html(generateInfoHTML(vsblMarkers)).show();
  234.             map_old_zoom = map.getZoom(); map_old_center = map.getCenter();
  235.     }
  236.        
  237.         //$(panel).mCustomScrollbar('update');
  238.     }
  239.     //=====================================================
  240.  
  241.     this.markersReloaded = function () {
  242.         _SetInfoPanel();
  243.         if (_MarkerReloadedCallback && typeof (_MarkerReloadedCallback) === "function") _MarkerReloadedCallback(currentObjectsList, L());
  244.     };
  245.     //=====================================================
  246.  
  247. } //function Locations
  248.  
  249. /**************************************************************************************/
  250. /**************************************************************************************/
  251. /**************************************************************************************/
  252. /**************************************************************************************/
  253. /**************************************************************************************/
  254. function initCities(who, lng) {
  255.     var choose = "Моля изберете град...";
  256.     if(lng=="en") choose = "Please choose city..."
  257.     //проблема, е че Cities e асоциативен арей (демек Dictionary) и не можем да го сортираме...затова  Ще го прехвърлим в арей в арей ;)
  258.     var tuples = [];
  259.     for (var val in who.Cities()) tuples.push([val, who.Cities()[val]]);
  260.     //и след това ще го сортираме като попове!
  261.     tuples.sort(function (a, b) {
  262.         a = a[1].name.toLowerCase(); b = b[1].name.toLowerCase();
  263.         return a < b ? -1 : (a > b ? 1 : 0); //първо по име
  264.     })
  265.     .sort(function (a, b) {
  266.         a = a[1].order; b = b[1].order;
  267.         return a < b ? -1 : (a > b ? 1 : 0);
  268.         });   //след това по ордер!
  269.  
  270. //хайде най-накрая да направим комбото!
  271.     var s = $("#cityselect"); s.empty();
  272.     $('<option />', { value: "", text: choose }).appendTo(s);
  273.     for (var i = 0; i < tuples.length; i++ ) {
  274.         var ct = tuples[i][1].name;
  275.         ct = ct.charAt(0).toUpperCase() + ct.slice(1);
  276.         $('<option mapZoomLevel="'+ tuples[i][1].zoom + '">' + ct + "</option>").appendTo(s);
  277.     }
  278.     //хайде сега да го направим търсещо..
  279.    
  280.     //и сега ако е дошъл QRY string
  281.     var vc = getParameterByName("c").toLowerCase();
  282.     if (vc.length > 2 && vc.length < 20)
  283.     {
  284.         var opt = s.find("option").filter(function () { return $(this).text().toLowerCase() === vc.toLowerCase(); });  //хващаме го case insensitive po text!
  285.         if (opt.length > 0) { //ако сме хванали някой град, направо шием SetFocus
  286.             s.val(vc.charAt(0).toUpperCase() + vc.slice(1)); //е естествено сетваме и комбото ;)
  287.             SetFocusToCity(vc, opt.first().attr("mapZoomLevel")); //да не забравяме и да викнем функцията за позициониране на картата.
  288.         }
  289.     }  
  290.     s.chosen({ disable_search_threshold: 10, placeholder_text_single: choose }); //и тук най-нагло си го правим търсещо ;)
  291. }
  292. //==================================================================================
  293. function locationPicked(i) {
  294.     top.locations.pickMarker(i);
  295. }
  296.  
  297. //==================================================================================
  298. function map_initialize(who) {
  299.     //infowindow = new google.maps.InfoWindow({ content: "Object..."    });
  300.     // инициализиране на картата
  301.         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" }      ]    } */];
  302.    
  303.         var map = new google.maps.Map(document.getElementById(who), {
  304.         mapTypeControlOptions: {
  305.       mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID]
  306.     },
  307.         zoom: 7,
  308.         center: new google.maps.LatLng(42.7500, 25.5000),
  309.        // styles:styles,
  310.         mapTypeId: google.maps.MapTypeId.ROADMAP
  311.     });
  312.     return map;
  313. }
  314. //==================================================================================
  315. function zoomTo(who, zoom) {
  316.     map.setCenter(who);
  317.     map.setZoom(zoom);
  318. }
  319.  
  320. //==================================================================================
  321. // DDL onchange function
  322. function SetFocusToCity(cityName, zoom) {
  323.     var geocoder = new google.maps.Geocoder();
  324.     var country = 'България,';
  325.     var city = cityName;
  326.     var ind_city = jQuery('#cityselect').val();
  327.     if (ind_city.length > 0) {
  328.         var address = country + city;
  329.         //geocoder.geocode({ address: address }, focusPoint);
  330.         geocoder.geocode( { 'address': address}, function(results, status) {
  331.     if (status == google.maps.GeocoderStatus.OK) {
  332.       map.setCenter(results[0].geometry.location);
  333.       map.setZoom(zoom*1);
  334.       //var marker = new google.maps.Marker({          map: map,          position: results[0].geometry.location      });
  335.     } else {
  336.      
  337.     }
  338.   });
  339.     }
  340.     else {
  341.         // nocity selected
  342.         var Abs_center_position = new google.maps.LatLng(42.7500, 25.5000);
  343.         map.setCenter(Abs_center_position);
  344.         map.setZoom(7);
  345.     }
  346. } // function
  347.  
  348. //==================================================================================
  349. function getParameterByName(name) {
  350.     name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  351.     var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
  352.         results = regex.exec(location.search);
  353.     return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
  354. }
  355. //==================================================================================
Add Comment
Please, Sign In to add comment