var JuoooMap = {
  jodecoder: null, 
  inited: false,
  marker: null,
  savemsg: false,
  curLatlng: null,
  curComment: "",
  toEdit: false,
  searchControl: null,
  getDecoder: function(){
    if (!this.jodecoder){
      this.jodecoder = new GClientGeocoder();
    }
    return this.jodecoder;
  },
  decodeLocation: function(loc, callback){
    this.getDecoder().getLatLng(loc, callback);
  },
  init: function(){
    if (this.inited)
      return;
    this.inited = true;
    GMap2.prototype.panToLocation = function(loc){
      var self = this;
      JuoooMap.decodeLocation(loc, function(latlng){
        if (latlng){
          self.panTo(latlng);
          if (JuoooMap.marker)
            JuoooMap.marker.setLatLng(latlng);
        }
      });
    }

    GMarker.prototype.showInfo = function(){
      GEvent.trigger(this, "click");
    }

    GEvent.addDomListener(window, "unload", GUnload);
  },
  genHTML: function(latlng, addr){
             var html = ["<div style='padding-right: 8px; padding-top: 4px; width: 260px'>", "<h3>"+faddr2+"</h3>"];
             if (addr){
               html.push("<div>"+addr+"</div>");
             }

             var comment = JuoooMap.curComment.replace(/&/g,'&amp;').replace(/</g, "&lt;").replace(/>/g, "&gt;");
             comment = comment.replace(/\r/g, "").replace(/\n/g, "<br />");
             if (JuoooMap.editable){
               if (JuoooMap.savemsg){
                 html.push(JuoooMap.savemsg);
                 JuoooMap.savemsg = false;
               }
               if (!latlng.equals(savedLatlng) || JuoooMap.curComment != savedComment || JuoooMap.toEdit){
                 JuoooMap.toEdit = false;
                 JuoooMap.curLatlng = latlng;
                 html = html.concat(["<div>",
                     "<textarea id='mapta_comment' style='width: 100%; margin-top: 0.5em;' rows='5'>",
                     JuoooMap.curComment,
                     "</textarea>",
                     "</div>",
                     "<div style='text-align: right; margin-top: 1em;'>",
                     "<input type='button' id='mapbtn_cancel' value='取消' />",
                     "<input type='button' id='mapbtn_save' value='保存' />",
                     "</div>"]);
               } else {
                 html = html.concat(["<div style='color: #5D5D5D'>"+comment+"</div>", "拖动小气球可以修改位置", " ", "<a href='javascript:void()' id='maplink_edit'>编辑注释</a>"]);
               }
             } else {
               html = html.concat(["<div style='color: #5D5D5D'>"+comment+"</div>", "<a href='http://ditu.google.cn/maps?hl=zh-CN&ie=UTF8&dirflg=r&f=d&daddr="+faddr2+"' target='_blank'>驾车/公交路线</a>"]);
             }
             html.push("</div>");
             return html.join("");
           },
  bindSaveListener: function(marker){
                      GEvent.addListener(marker, "infowindowopen", function(){
                          $("#mapbtn_save").click(function(){
                            var curLatlng = JuoooMap.curLatlng, curComment = JuoooMap.curComment = $("#mapta_comment").val();
                            var data = {lat: curLatlng.lat(), lng: curLatlng.lng(), comment: curComment};
                            $.post(saveURL, data, function(txt){
                              var msg = txt.substr(2);
                              if (txt.charAt(0) == "0"){
                                savedLatlng = curLatlng;
                                savedComment = curComment;
                                if (!JuoooMap.marker.getLatLng().equals(curLatlng)){
                                  JuoooMap.marker.setLatLng(curLatlng);
                                  JuoooMap.searchControl.goIdle();
                                }
                                JuoooMap.savemsg = "<div style='color: green'>"+msg+"</div>";
                              } else {
                                JuoooMap.savemsg = "<div style='color: #F00'>"+msg+"</div>";
                              }
                              JuoooMap.marker.showInfo();
                            });
                          });
                          $("#mapbtn_cancel").click(function(){
                            $("#mapta_comment")[0].id = "";
                            JuoooMap.marker.setLatLng(savedLatlng);
                            JuoooMap.curComment = savedComment;
                            JuoooMap.marker.showInfo();
                          });
                          $("#maplink_edit").click(function(){
                              JuoooMap.toEdit = true;
                              JuoooMap.marker.showInfo();
                          });
                          if ($("#mapta_comment").length){
                            $("#mapta_comment").focus();
                          }
                      });
                      GEvent.addListener(marker, "infowindowbeforeclose", function(){
                          if ($("#mapta_comment").length){
                            JuoooMap.curComment = $("#mapta_comment").val();
                          }
                      });
  },
  initMap: function(map){
             map.setCenter(new GLatLng(lat, lng), 13);
             map.enableContinuousZoom();
             map.enableScrollWheelZoom();
             var o=map.getDefaultUI();
             o.controls.maptypecontrol=false;
             o.maptypes.physical = false;
             map.setUI(o);
             map.addControl(new GHierarchicalMapTypeControl());
             JuoooMap.marker = new GMarker(map.getCenter(), {draggable: true});
             if (!JuoooMap.editable)
               JuoooMap.marker.disableDragging();
             map.addOverlay(JuoooMap.marker);
             GEvent.addListener(JuoooMap.marker, "click", function(){
                 var curLatlng = JuoooMap.marker.getLatLng();
                 JuoooMap.marker.openInfoWindowHtml(JuoooMap.genHTML(curLatlng));
             });
             if (JuoooMap.editable){
               JuoooMap.bindSaveListener(JuoooMap.marker);
               GEvent.addListener(JuoooMap.marker, "dragstart", function(){
                   JuoooMap.marker.closeInfoWindow();
               });
               GEvent.addListener(JuoooMap.marker, "dragend", function(){
                   JuoooMap.marker.showInfo();
               });
             }
             if (map.getSize().height > 300){
               JuoooMap.marker.showInfo();
             }
           },
  createMap: function(mapdiv){
                    var map;
                    if (GBrowserIsCompatible()) {
                      this.init();
                      map = new GMap2(mapdiv);
                      savedLatlng = new GLatLng(lat, lng);
                      JuoooMap.curComment = savedComment = fcomment;
                      if (lat && lng){
                        JuoooMap.initMap(map);
                      } else {
                        var tries = [faddr, faddr2];
                        var tryfunc = function(){
                          var addr = tries.pop();
                          JuoooMap.decodeLocation(addr, function(latlng){
                              if (latlng){
                                lat = latlng.lat(), lng = latlng.lng();
                              } else if (tries.length){
                                tryfunc();
                                return;
                              } else {
                                lat = 35.86166, lng = 104.195397;
                              }
                              JuoooMap.initMap(map);
                          });
                        }
                        tryfunc();
                      }
                    }
                    return map;
  },
  createEditMap: function(mapdiv){
                   JuoooMap.editable = true;
                   var map = this.createMap(mapdiv);
                   if (map){
                     function h(o,p,n){
                       var point = o.getLatLng();
                       if (!o.__zzz){
                         o.__zzz = true;
                         JuoooMap.bindSaveListener(o);
                       }
                       JuoooMap.getDecoder().getLocations(point, function(q){
                           var place = q.Placemark[0];
                           p.innerHTML = JuoooMap.genHTML(point, place.address);
                           o.openInfoWindowHtml(p);
                       });
                       return p;
                     }
                     var o={ onGenerateMarkerHtmlCallback:h, searchFormHint: "搜索关键词定位"} ;
                     var myLocalSearchControl=new google.maps.LocalSearch(o);
                     map.addControl(myLocalSearchControl,new GControlPosition(G_ANCHOR_BOTTOM_RIGHT,new GSize(10,20)));
                     JuoooMap.searchControl = myLocalSearchControl;
                   }
                   return map;
  }
};
