
if (typeof console == 'undefined'){
  var console = {};
  console.log = function(){};
}

var map = null;
var geocoder = null;

var marker_center = null;
var lat2lon = 1.563;

(function($){
  var sm_gmap_init = null;
  var sm_maps = {};
  var sm_maps_count = 0;
  var sm_map;
  var sm_map_def = {
      center:{zoom:4,x:30.5271814,y:50.440951},
      control:{smallZoom:true,smallControl:false}
    };

  function smGMapInit(){
    if (sm_gmap_init !== null) return sm_gmap_init;
    sm_gmap_init = false;
    if (GBrowserIsCompatible()) {
     sm_gmap_init = true;
     $().unload(GUnload());
    }
    return sm_gmap_init;
  }

  $.fn.smGMapMake = function(opt){
    if (!smGMapInit()) return false;
    opt = $.extend(sm_map_def, opt);

    sm_map = this;
    if (!sm_map.length) return false;

    var map_id;
    if(typeof(map_id = sm_map.attr('id')) =='undefined'){
      map_id = 'sm_map_id'+(sm_maps_count++);
      sm_map.attr('id',map_id);
    }
    sm_maps[map_id] = sm_map;
    sm_maps[map_id] = new GMap2($('#'+map_id).get(0));
    sm_map = sm_maps[map_id];
    
    sm_map.setCenter(new GLatLng(opt.center.y, opt.center.x), opt.center.zoom);
    opt.control.smallZoom && sm_map.addControl(new GSmallZoomControl());
    opt.control.smallControl && sm_map.addControl(new GSmallMapControl());
    return sm_map;
  }

  function smGetAddress(els){
    var data = [];
    var cur;
    jQuery(els).each(function(i,l){
      var el = jQuery(l);
      if(el.length) {
        switch ((el.attr('nodeName')).toUpperCase()) {
          case 'SELECT':
            cur = el.find('option:selected');
            data[i] = (cur.val() != 'none'?cur.text():null);
            break;
          default:
            data[i] = jQuery.trim(el.val());
            break;
        }
      } else {
        data[i] = null;
      }
    });
    //smShowAddress(data.toString(),args);
    return data;
  }

  var smGeocoder = null;
  $.fn.smShowAddress = function(args){
    sm_map = sm_maps[$(this).attr('id')];
    var address = '';
    if(args.address){
      address = args.address;
      args.address = null;
    } else {
      address = smGetAddress(args.els);
    }
      
    if (smGeocoder == null) smGeocoder = new GClientGeocoder();
    var _this = this;
    var info = {code:0,point:{}};
    smGeocoder.getLocations(
      address.join(', '),
      function(responce) {
        info.code = responce.Status.code;
        if (info.code != 200) {
          info.point = false;
          if(info.code == G_GEO_UNKNOWN_ADDRESS) {
            address.shift();
            args.address = address;
            $(_this).smShowAddress(args);
          }
        } else {
          marker_center && sm_map.removeOverlay(marker_center);
          info.point = pointMake(responce.Placemark[0].Point.coordinates);
          marker_center = new GMarker(info.point);
          sm_map.setCenter(info.point, smAccuracyInfo(responce.Placemark[0].AddressDetails.Accuracy,'zoom'));
          sm_map.addOverlay(marker_center);
          args.ads_x && jQuery(args.ads_x).attr('value',info.point.x);
          args.ads_y && jQuery(args.ads_y).attr('value',info.point.y);
          $(_this).smShowPolygon(info.point);
       }
      }
    );
  }


  function smAccuracyInfo(value,key){
    var info = {
      0:{'zoom':4},
      1:{'zoom':4},
      2:{'zoom':6},
      3:{'zoom':8},
      4:{'zoom':10},
      5:{'zoom':10},
      6:{'zoom':14},
      7:{'zoom':14},
      8:{'zoom':16}
    };
    return info[value][key];
  }

  function timeout_test(args){
    //args = $.data('timeout_test_args');
    console.log(args);
    console.log('args - cal func');
  }

  $.fn.smSetTimeEvent = function (els,func,args,time){
    sm_map = sm_maps[$(this).attr('id')];
    _this = this;
    jQuery(els.toString()).keyup(function(){
      timeoutDo(func,args,time,_this);
    }).change(function(){
      timeoutDo(func,args,time,_this);
    });
    //jQuery(els.toString()).attr('tagName').toUpperCase()
  }

  var showXml = {};
  $.fn.smShowXml = function(url,opts){

    if (!url) return;
    if (!showXml[url]) showXml[url] = {'show' : false,'obj':false};
    opts = $.extend({
      zoomShow:10
    }, opts);
    sm_map = sm_maps[$(this).attr('id')];
    var zoomShow = opts.zoomShow;

    if (!showXml[url].obj) {
      showXml[url].obj = new GGeoXml(url);
      sm_map.addOverlay(showXml[url].obj);
    }
    if (!opts.zoomShow) return;
    if (zoomShow > sm_map.getZoom()) {
      GEvent.addListener(showXml[url].obj,'load',function(){
        this.hide();
      });
    }
    GEvent.addListener(sm_map,'zoomend',function(zoomOld,zoomNew){
      if (zoomShow <= zoomNew ){
        showXml[url].obj.isHidden() && showXml[url].obj.show();
      } else {
        showXml[url].obj.hide();
      }
    });
  }

  var polygon;
  $.fn.smShowPolygon = function(point,r){
    sm_map = sm_maps[$(this).attr('id')];
    polygon && sm_map.removeOverlay(polygon);
    var lat = point.y;
    var lon = point.x;

    var latOffset = r || 0.01;
    var lonOffset = latOffset*lat2lon;
    polygon = new GPolygon([
      new GLatLng(lat + latOffset, lon - lonOffset),
      new GLatLng(lat + latOffset, lon + lonOffset),
      new GLatLng(lat - latOffset, lon + lonOffset),
      new GLatLng(lat - latOffset, lon - lonOffset),
      new GLatLng(lat + latOffset, lon - lonOffset)
    ], "#008919", 1, 1, "#00FF00", 0.1);
    sm_map.addOverlay(polygon);
  }

  $.fn.smGMapLayerAdd = function(id,css){
    sm_map = sm_maps[$(this).attr('id')];
    css = $.extend({
      position:'absolute',width:'100px',color:'#000',display:'none'
    }, css)
    $('<div id="'+id+'" style="position:absolute;" />').css(css)
      .appendTo(sm_map.getPane(G_MAP_FLOAT_PANE));
  }

  var layers = {};
  $.fn.mapMessage = function(latlng, text, opt){
    sm_map = sm_maps[$(this).attr('id')];
    var opt_def = {
      css:{},
      move:false,
      id:'message'
    }
    opt = $.extend(opt_def, opt);
    if (!layers[opt.id]){$(this).smGMapLayerAdd(opt.id)}
    opt.move && sm_map.panTo(latlng);
    //var markerOffset = map_search.fromLatLngToDivPixel(marker.getPoint());
    var markerOffset = sm_map.fromLatLngToDivPixel(latlng);
    var el = $("#"+opt.id);
    el.text(text);//.stop(true,true).hide();
    opt.css.top = markerOffset.y - el.height() - 12;
    opt.css.left = markerOffset.x - el.width()/2;
    el.show().css(opt.css);
  }

  $.fn.smShowMarker = function(opts){
    console.log(opts);
    opts[0] = opts[0] || opts.x || 0;
    opts[1] = opts[1] || opts.y || 0;
    opts.zoom = opts.zoom || 0;

    sm_map = sm_maps[$(this).attr('id')];

    var point = pointMake(opts);
    var marker = new GMarker(point);
    opts.zoom && sm_map.setCenter(point, opts.zoom);
    console.log(opts,marker,point);
    sm_map.addOverlay(marker);
    return sm_map;
  }

  // for work
  var smRemTimeout = {};
  function timeoutDo(func,args,time,_this){
      if (!func) return;
      if (time === null) time = 1500;
      clearTimeout(smRemTimeout[func]);
      //smShowAddress(args);
      if($.fn[func]){
        smRemTimeout[func] = setTimeout(function(){$(_this)[func](args);},time);
      } else if (window[func]){
        smRemTimeout[func] = setTimeout(function(){window[func](args);},time);
      }
      //if($.smShowAddress)
      //
  }

})(jQuery);


// -------------------------------------------------

function mapInit(id,zoom) {
  if (!id) id = "map_canvas";
  if (!jQuery('#'+id)) return ;
  if (GBrowserIsCompatible()) {
    map = new GMap2(jQuery('#'+id).get(0));
    zoom && map.addControl(new GSmallZoomControl());
    map.setCenter(new GLatLng(50.440951, 30.5271814), 4);
    geocoder = new GClientGeocoder();
  }
}

function showAddress(address) {
  if (geocoder) {
    geocoder.getLocations(
      address,
      function(responce) {
        map.clearOverlays();

        if (responce.Status.code != 200) {
          jQuery('#map_mesage').text('not Found '+address);
          jQuery('#cwp_street_div input[name="ads[x]"]').attr('value',0);
          jQuery('#cwp_street_div input[name="ads[y]"]').attr('value',0);
        } else {
          var point = pointMake(responce.Placemark[0].Point.coordinates);
          map.setCenter(point, 14);
          var marker = new GMarker(point);
          map.addOverlay(marker);
          marker.openInfoWindowHtml(address);
          jQuery('#map_mesage').text(point.toString());
          jQuery('#cwp_street_div input[name="ads[x]"]').attr('value',point.x);
          jQuery('#cwp_street_div input[name="ads[y]"]').attr('value',point.y);
        }
      }
    );
  }
}

function pointMake(coordinates){
  return new GLatLng(coordinates[1],coordinates[0]);
}

function GMapStart(){
jQuery('document').ready(function(){
  mapInit('map_canvas',true);
}).unload(function(){
  GUnload();
});
}

var map_search;
jQuery('document').ready(function(){
  map_search = jQuery('#map_search').smGMapMake({control:{smallZoom:true}});
  if (!map_search) return;
  jQuery('#map_search').smSetTimeEvent(['#cwp_street','#cwp_city','#cwp_country']
    ,'smShowAddress',{els:['#cwp_street','#cwp_city','#cwp_country']
    ,ads_x:'#cwp_x',ads_y:'#cwp_y'},15);
  jQuery('#map_search').smShowXml("http://pricereal.com.ua/pub_nedvizhimost/kml/kiev_metro5.kml");
  //
  GEvent.addListener(map_search,"addoverlay",function(overlay) {
    if (overlay.name && !overlay.Known) {
      overlay.Known = true;
      overlay.__e_.click = null;

      GEvent.addListener(overlay,'mouseover',function(point){
        jQuery('#map_search').mapMessage(point,overlay.name
        ,{css:{'text-align':'center','background-color':'#FCFFCD','border':'1px solid #FFA349'}});
      });
      GEvent.addListener(overlay,'mouseout',function(){
        jQuery('#message').hide(0);
      });
      GEvent.addListener(overlay,'click',function(point){
        marker_center && map_search.removeOverlay(marker_center);

        marker_center = new GMarker(point);
        var zoom = map_search.getZoom()
        zoom = zoom == 4?14:zoom;

        map_search.setCenter(point,zoom);
        map_search.addOverlay(marker_center);
        jQuery('#cwp_x').val(point.x);
        jQuery('#cwp_y').val(point.y);

        jQuery('#map_search').smShowPolygon(point);
      });
    }
  });
  GEvent.addListener(map_search,'click',function(overlay,point) {
    if (!point) return; //point = overlay.getPoint();
    marker_center && map_search.removeOverlay(marker_center);

    marker_center = new GMarker(point);
    var zoom = map_search.getZoom() 
    zoom = zoom == 4?14:zoom;

    map_search.setCenter(point,zoom);
    map_search.addOverlay(marker_center);
    jQuery('#cwp_x').val(point.x);
    jQuery('#cwp_y').val(point.y);

    jQuery('#map_search').smShowPolygon(point);
  });
});

// -----------------------------------------------------

