Advertisement
abushyk

geodata.js

Nov 4th, 2015
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function($){
  2.     jQuery.fn.Geodata = function(options){
  3.         var _defaults = {width: 350, height: 350};
  4.        
  5.         var options = $.extend(true, _defaults, options);
  6.        
  7.         var PositionEditor={
  8.             init: function(map){
  9.                 this.map=map;
  10.                 this.settedMarker=null;
  11.             },
  12.             initMarker: function(x,y,id){
  13.                 if(x!='' && y!=''){
  14.                     var latlng = new google.maps.LatLng(Number(x), Number(y));
  15.                     this.createPositionMarker(latlng,id);
  16.                     this.map.setCenter(latlng);
  17.                 }else{
  18.                     if(this.settedMarker!=null){
  19.                         this.settedMarker.setMap(null);
  20.                         this.settedMarker=null;
  21.                     }
  22.                 }
  23.                
  24.             },
  25.  
  26.             createPositionMarker: function(latlng, id){
  27.                    
  28.                 var lat=new String(latlng.lat());
  29.                 var lng=new String(latlng.lng());
  30.                 var lat_parts=lat.split('.');
  31.                 if(lat_parts[1]!==undefined && lat_parts[1].length>6){
  32.                     lat=lat_parts[0]+'.'+lat_parts[1].substring(0,6);
  33.                 }
  34.                 var lng_parts=lng.split('.');
  35.                 if(lng_parts[1]!==undefined && lng_parts[1].length>6){
  36.                     lng=lng_parts[0]+'.'+lng_parts[1].substring(0,6);
  37.                 }
  38.                
  39.                 if(this.settedMarker!=null){
  40.                     this.settedMarker.setMap(null);
  41.                     this.settedMarker=null;
  42.                 }
  43.                
  44.                 var marker = new google.maps.Marker({
  45.                     position: latlng,
  46.                     map: this.map,
  47.                     draggable: false,
  48.                     title:latlng.lat()+' '+latlng.lng()
  49.                 });
  50.                 this.settedMarker=marker;
  51.                 var ret=[];
  52.                 ret.push(lat);
  53.                 ret.push(lng);
  54.                 return ret;
  55.             }
  56.         }
  57.         var PositionEditorYandex={
  58.             init: function(map){
  59.                 this.map=map;
  60.                 this.settedMarker=null;
  61.             },
  62.             initMarker: function(x, y, id){
  63.                 if(x!='' && y!=''){
  64.                     //var latlng = new google.maps.LatLng(new Number(x),new Number(y));
  65.                     var latlng=new Array(new Number(x),new Number(y));
  66.                     this.createPositionMarker(latlng, id);
  67.                     this.map.setCenter(latlng);
  68.                 }else{
  69.                     if(this.settedMarker!=null){
  70.                         this.settedMarker.setMap(null);
  71.                         this.settedMarker=null;
  72.                     }
  73.                 }
  74.                
  75.             },
  76.  
  77.             createPositionMarker: function(latlng, id){
  78.                    
  79.                 var lat=new String(latlng[0]);
  80.                 var lng=new String(latlng[1]);
  81.                 var lat_parts=lat.split('.');
  82.                 if(lat_parts[1]!==undefined && lat_parts[1].length>6){
  83.                     lat=lat_parts[0]+'.'+lat_parts[1].substring(0,6);
  84.                 }
  85.                 var lng_parts=lng.split('.');
  86.                 if(lng_parts[1]!==undefined && lng_parts[1].length>6){
  87.                     lng=lng_parts[0]+'.'+lng_parts[1].substring(0,6);
  88.                 }
  89.                
  90.                 if(this.settedMarker!=null){
  91.                     this.map.geoObjects.remove(this.settedMarker);
  92.                     this.settedMarker=null;
  93.                 }
  94.                 var myPlacemark = new ymaps.Placemark(
  95.                     latlng,
  96.                     {
  97.                         iconContent: '',
  98.                     },
  99.                     {
  100.                         draggable: false,
  101.                     }
  102.                 );
  103.                 this.map.geoObjects.add(myPlacemark);
  104.                
  105.                
  106.                 this.settedMarker=myPlacemark;
  107.                 var ret=[];
  108.                 ret.push(lat);
  109.                 ret.push(lng);
  110.                 return ret;
  111.             }
  112.         }
  113.         var GDC=$(this);
  114.        
  115.         var parent_form=GDC.parents('form').eq(0);
  116.        
  117.         var map_center_string=GDC.attr('coords');
  118.         var map_zoom=GDC.attr('zoom');
  119.        
  120.         if(map_zoom=='' || map_zoom=='0'){
  121.             map_zoom=Number(10);
  122.         }else{
  123.             map_zoom=Number(map_zoom);
  124.         }
  125.        
  126.         if(map_center_string!=''){
  127.             var c=map_center_string.split(',');
  128.         }else{
  129.             var c=[55.751849,37.622681];
  130.         }
  131.        
  132.        
  133.         var late=GDC.find('[geodata=lat]');
  134.         var lnge=GDC.find('[geodata=lng]');
  135.         if(options.map_type!='google'){
  136.             options.map_type='yandex';
  137.         }
  138.        
  139.         if(options.map_type=='google' && typeof google === 'object'){
  140.             if(late && lnge){
  141.                 var map_id='map_'+CryptoJS.MD5((new Date()).toString()+'_'+(Math.floor(Math.random() * (999 - 100 + 1)) + 100));
  142.                 var map=initializeGoogleLocationsMap(map_id);
  143.                
  144.                 var PE=PositionEditor.init(map);
  145.                 google.maps.event.addDomListener(map, 'click', function(event) {
  146.                     var geo_c=PositionEditor.createPositionMarker(event.latLng, 0);
  147.                     late.val(geo_c[0]);
  148.                     lnge.val(geo_c[1]);
  149.                 });
  150.                 var lat=late.val();
  151.                 var lng=lnge.val();
  152.                 if(lat!='' && lng!=''){
  153.                     PositionEditor.initMarker(lat, lng, 0);
  154.                 }
  155.                
  156.                 late.change(function(){
  157.                     var lng=lnge.val();
  158.                     var lat=late.val();
  159.                     if(lat!='' && lng!=''){
  160.                         runMapChange(map, lat, lng);
  161.                         PositionEditor.initMarker(lat, lng, 0);
  162.                     }
  163.                 });
  164.                
  165.                 lnge.change(function(){
  166.                     var lng=lnge.val();
  167.                     var lat=late.val();
  168.                     if(lat!='' && lng!=''){
  169.                         runMapChange(map, lat, lng);
  170.                         PositionEditor.initMarker(lat, lng, 0);
  171.                     }
  172.                 });
  173.             }
  174.         }else{
  175.             if(late && lnge){
  176.                 var map_id='map_'+CryptoJS.MD5((new Date()).toString()+'_'+(Math.floor(Math.random() * (999 - 100 + 1)) + 100));
  177.                 ymaps.ready(function(){
  178.                     var map=initializeYandexLocationsMap(map_id);
  179.                     var PE=PositionEditorYandex.init(map);
  180.                     map.events.add('click', function (e) {
  181.                         var geo_c=PositionEditorYandex.createPositionMarker(e.get('coordPosition'), 0);
  182.                         late.val(geo_c[0]);
  183.                         lnge.val(geo_c[1]);
  184.                     });
  185.                     var lat=late.val();
  186.                     var lng=lnge.val();
  187.                     if(lat!='' && lng!=''){
  188.                         PositionEditorYandex.initMarker(lat, lng, 0);
  189.                     }
  190.                    
  191.                    
  192.                     late.change(function(){
  193.                        
  194.                         var lng=lnge.val();
  195.                         var lat=late.val();
  196.                         if(lat!='' && lng!=''){
  197.                             runMapChange(map, lat, lng);
  198.                             //PositionEditor.init(map);
  199.                             PositionEditorYandex.initMarker(lat, lng, 0);
  200.                         }
  201.                     });
  202.                    
  203.                     lnge.change(function(){
  204.                        
  205.                         var lng=lnge.val();
  206.                         var lat=late.val();
  207.                         if(lat!='' && lng!=''){
  208.                             runMapChange(map, lat, lng);
  209.                             //PositionEditor.init(map);
  210.                             PositionEditorYandex.initMarker(lat, lng, 0);
  211.                         }
  212.                     });
  213.                 });
  214.                
  215.             }
  216.         }
  217.        
  218.         function runMapChange(map, lat, lng){
  219.             if(options.map_type=='google'){
  220.                 map.panTo(new google.maps.LatLng(lat,lng));
  221.                 //map.setCenter(new google.maps.LatLng(lat, lng));
  222.                 //map.panTo(new google.maps.LatLng(lat, lng));
  223.             }else{
  224.                 //map.setCenter(new Array(lat, lng));
  225.                 map.panTo(new Array(lat, lng));
  226.             }
  227.         }
  228.        
  229.         function initializeYandexLocationsMap(map_id){
  230.             var behaviors=[];
  231.             behaviors.push("drag");
  232.             behaviors.push("dblClickZoom");
  233.             behaviors.push("scrollZoom");
  234.            
  235.             var latlng=new Array(Number(c[0]), Number(c[1]));
  236.             var m=$('<div id="'+map_id+'" style="width:'+options.width+'px; height:'+options.height+'px"></div>')
  237.             m.appendTo($('body')).css({'position':'absolute','left':'-1000px','display':'block'});
  238.             if(options.map_view_type=='m'){
  239.                 var map_view_type='yandex#map';
  240.             }else if(options.map_view_type=='h'){
  241.                 var map_view_type='yandex#hybrid';
  242.             }else if(options.map_view_type=='s'){
  243.                 var map_view_type='yandex#satellite';
  244.             }else if(options.map_view_type=='p'){
  245.                 var map_view_type='yandex#publicMap';
  246.             }else{
  247.                 var map_view_type='yandex#map';
  248.             }
  249.             var map = new ymaps.Map(document.getElementById(map_id), {
  250.                 zoom: map_zoom,
  251.                 center: latlng,
  252.                 behaviors: behaviors,
  253.                 type : map_view_type
  254.                 });
  255.             map.controls.add(new ymaps.control.TypeSelector(['yandex#map', 'yandex#publicMap', 'yandex#satellite', 'yandex#hybrid']));
  256.             map.controls.add('scaleLine');
  257.             map.controls.add('zoomControl', { top: 75, left: 5 });
  258.             m.css({'position':'relative','left':'0'}).appendTo(GDC);
  259.             return map;
  260.         }
  261.        
  262.         function initializeGoogleLocationsMap(map_id){
  263.             var latlng = new google.maps.LatLng(Number(c[0]), Number(c[1]));
  264.             if(options.map_view_type=='m'){
  265.                 var map_view_type=google.maps.MapTypeId.ROADMAP;
  266.             }else if(options.map_view_type=='h'){
  267.                 var map_view_type=google.maps.MapTypeId.HYBRID;
  268.             }else if(options.map_view_type=='s'){
  269.                 var map_view_type=google.maps.MapTypeId.SATELLITE;
  270.             }else{
  271.                 var map_view_type=google.maps.MapTypeId.ROADMAP;
  272.             }
  273.             var myOptions = {
  274.                 zoom: map_zoom,
  275.                 center: latlng,
  276.                 mapTypeId: map_view_type
  277.             };
  278.            
  279.             var m=$('<div id="'+map_id+'" style="width:'+options.width+'px; height:'+options.height+'px"></div>')
  280.             m.appendTo($('body')).css({'position':'absolute','left':'-1000px','display':'block'});
  281.             var map = new google.maps.Map(document.getElementById(map_id), myOptions);
  282.            
  283.             google.maps.event.addDomListener(map, 'tilesloaded', function(event) {
  284.                 m.css({'position':'relative','left':'0'}).appendTo(GDC);
  285.             });
  286.            
  287.             return map;
  288.         }
  289.        
  290.         function georun(str){
  291.             $.ajax({
  292.                 url: estate_folder+'/apps/geodata/js/ajax.php',
  293.                 dataType: 'json',
  294.                 data: {action: 'geocode_fast', input: str},
  295.                 success: function(json){
  296.                     if(json.lat !== undefined && json.lng !== undefined){
  297.                         $('form input[geodata=lat]').val(json.lat).trigger('change');
  298.                         $('form [geodata=lng]').val(json.lng).trigger('change');
  299.                     }
  300.                 }
  301.             });
  302.         }
  303.        
  304.         if(options.confields.length>0 && parent_form.legth!=0){
  305.             var prev_els_array=[];
  306.             for(var i=0; i<options.confields.length; i++){
  307.                 prev_els_array[options.confields[i]]=options.confields.slice(0, i+1);
  308.                
  309.                 var element_for_event='[name='+options.confields[i]+']';
  310.        
  311.                
  312.                
  313.                 parent_form.on('change', element_for_event, function(){
  314.                     var $this=$(this);
  315.                     var name=this.name;
  316.                    
  317.                     var n=[];
  318.                    
  319.                     for(var k=0; k<prev_els_array[name].length; k++){
  320.                         var el=parent_form.find('[name='+prev_els_array[name][k]+']');
  321.                         if(el.prop("tagName").toLowerCase()=='select'){
  322.                             if(el.val()!=0){
  323.                                 n.push(el.find('option:selected').text());
  324.                             }
  325.                         }else if(el.prop("tagName").toLowerCase()=='input'){
  326.                             if(el.parents('.geoautocomplete_block').length>0){
  327.                                 if(el.parents('.geoautocomplete_block').find('.geoautocomplete').eq(0).val()!=''){
  328.                                     n.push(el.parents('.geoautocomplete_block').find('.geoautocomplete').eq(0).val());
  329.                                 }
  330.                             }else if(el.val()!=''){
  331.                                 n.push(el.val());
  332.                             }
  333.                            
  334.                         }
  335.                     }
  336.                     georun(n.join(','));
  337.                 });
  338.             }
  339.         }
  340.     };
  341. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement