/**
 * jQuery gMap v3
 *
 * @url         http://www.smashinglabs.pl/gmap
 * @author      Sebastian Poreba <sebastian.poreba@gmail.com>
 * @version     3.3.0 alpha
 * @date        26.05.2011
 */
(function(j){var m=function(){this.markers=[];this.mainMarker=!1;this.icon="http://www.google.com/mapfiles/marker.png"};m.prototype.dist=function(a){return Math.sqrt(Math.pow(this.markers[0].latitude-a.latitude,2)+Math.pow(this.markers[0].longitude-a.longitude,2))};m.prototype.setIcon=function(a){this.icon=a};m.prototype.addMarker=function(a){this.markers[this.markers.length]=a};m.prototype.getMarker=function(){if(this.mainmarker)return this.mainmarker;var a,b;this.markers.length>1?(a=new f.MarkerImage("http://thydzik.com/thydzikGoogleMap/markerlink.php?text="+
this.markers.length+"&color=EF9D3F"),b="cluster of "+this.markers.length+" markers"):(a=new f.MarkerImage(this.icon),b=this.markers[0].title);return this.mainmarker=new f.Marker({position:new f.LatLng(this.markers[0].latitude,this.markers[0].longitude),icon:a,title:b,map:null})};var f=google.maps,n=new f.Geocoder,o=0,h={},h={init:function(a){var b,c=j.extend({},j.fn.gMap.defaults,a);for(b in j.fn.gMap.defaults.icon)c.icon[b]||(c.icon[b]=j.fn.gMap.defaults.icon[b]);return this.each(function(){var a=
j(this),b=h._getMapCenter.apply(a,[c]),e,g,l,k=39135.758482;if(c.zoom=="fit"){e=h._getBoundaries(c);g=(e.E-e.W)*111E3/a.width();l=(e.S-e.N)*111E3/a.height();for(e=2;e<20;e+=1){if(g>k||l>k)break;k/=2}c.zoom=e-2}g=new f.Map(this,{zoom:c.zoom,center:b,mapTypeControl:c.mapTypeControl,zoomControl:c.zoomControl,panControl:c.panControl,scaleControl:c.scaleControl,streetViewControl:c.streetViewControl,mapTypeId:c.maptype,scrollwheel:c.scrollwheel});c.log&&console.log("map center is:");c.log&&console.log(b);
a.data("$gmap",g);a.data("gmap",{opts:c,gmap:g,markers:[],markerKeys:{},infoWindow:null,clusters:[]});if(c.controls.length!==0)for(e=0;e<c.controls.length;e+=1)g.controls[c.controls[e].pos].push(c.controls[e].div);if(c.clustering)b=a.data("gmap"),b.markers=c.markers,h.renderCluster.apply(a,[]),f.event.addListener(g,"bounds_changed",function(){h.renderCluster.apply(a,[])});else if(c.markers.length!==0)for(e=0;e<c.markers.length;e+=1)h.addMarker.apply(a,[c.markers[e]]);h._onComplete.apply(a,[])})},
_onComplete:function(){var a=this.data("gmap"),b=this;if(o!==0)window.setTimeout(function(){h._onComplete.apply(b,[])},1E3);else a.opts.onComplete()},renderCluster:function(){var a=this.data("gmap"),b=a.markers,c=a.clusters,f=a.opts,d;for(d=0;d<c.length;d+=1)c[d].getMarker().setMap(null);c.length=0;if(d=a.gmap.getBounds()){var e=d.getNorthEast(),g=d.getSouthWest(),l=[],k=(e.lat()-g.lat())*f.clusterSize/100;for(d=0;d<b.length;d+=1)b[d].latitude<e.lat()&&b[d].latitude>g.lat()&&b[d].longitude<e.lng()&&
b[d].longitude>g.lng()&&(l[l.length]=b[d]);f.log&&console.log("number of markers "+l.length+"/"+b.length);f.log&&console.log("cluster radius: "+k);for(d=0;d<l.length;d+=1){e=-1;for(b=0;b<c.length;b+=1)if(g=c[b].dist(l[d]),g<k&&(e=b,f.fastClustering))break;e===-1?(b=new m,b.addMarker(l[d]),c[c.length]=b):c[e].addMarker(l[d])}f.log&&console.log("Total clusters in viewport: "+c.length);for(b=0;b<c.length;b+=1)c[b].getMarker().setMap(a.gmap)}else{var j=this;window.setTimeout(function(){h.renderCluster.apply(j)},
1E3)}},_setMapCenter:function(a){var b=this.data("gmap");b.opts.log&&console.log("delayed setMapCenter called");if(b.gmap!==void 0)b.gmap.setCenter(a);else{var c=this;window.setTimeout(function(){h._setMapCenter.apply(c,[a])},500)}},_boundaries:null,_getBoundaries:function(a){if(h._boundaries)return h._boundaries;var b=a.markers[0].latitude,c=a.markers[0].longitude,f=a.markers[0].longitude,d=a.markers[0].latitude,e;for(e=1;e<a.markers.length;e+=1){if(b>a.markers[e].latitude)b=a.markers[e].latitude;
if(c<a.markers[e].longitude)c=a.markers[e].longitude;if(f>a.markers[e].longitude)f=a.markers[e].longitude;if(d<a.markers[e].latitude)d=a.markers[e].latitude}h._boundaries={N:b,E:c,W:f,S:d};return h._boundaries},_getMapCenter:function(a){var b,c=this,i,d;if(a.markers.length&&(a.latitude=="fit"||a.longitude=="fit"))return b=h._getBoundaries(a),b=new f.LatLng((b.N+b.S)/2,(b.E+b.W)/2);if(a.latitude&&a.longitude)return b=new f.LatLng(a.latitude,a.longitude);else b=new f.LatLng(0,0);if(a.address)return n.geocode({address:a.address},
function(b,d){d===google.maps.GeocoderStatus.OK?h._setMapCenter.apply(c,[b[0].geometry.location]):a.log&&console.log("Geocode was not successful for the following reason: "+d)}),b;if(a.markers.length>0){d=null;for(i=0;i<a.markers.length;i+=1)if(a.markers[i].setCenter){d=a.markers[i];break}if(d===null)for(i=0;i<a.markers.length;i+=1){if(a.markers[i].latitude&&a.markers[i].longitude){d=a.markers[i];break}a.markers[i].address&&(d=a.markers[i])}if(d===null)return b;if(d.latitude&&d.longitude)return new f.LatLng(d.latitude,
d.longitude);d.address&&n.geocode({address:d.address},function(b,d){d===google.maps.GeocoderStatus.OK?h._setMapCenter.apply(c,[b[0].geometry.location]):a.log&&console.log("Geocode was not successful for the following reason: "+d)})}return b},processMarker:function(a,b,c,i){var d=this.data("gmap"),e=d.gmap,g=d.opts,h;i===void 0&&(i=new f.LatLng(a.latitude,a.longitude));if(!b)var k={image:g.icon.image,iconSize:new f.Size(g.icon.iconsize[0],g.icon.iconsize[1]),iconAnchor:new f.Point(g.icon.iconanchor[0],
g.icon.iconanchor[1]),infoWindowAnchor:new f.Size(g.icon.infowindowanchor[0],g.icon.infowindowanchor[1])},b=new f.MarkerImage(k.image,k.iconSize,null,k.iconAnchor);c||(new f.Size(g.icon.shadowsize[0],g.icon.shadowsize[1]),k&&k.iconAnchor||new f.Point(g.icon.iconanchor[0],g.icon.iconanchor[1]));b={position:i,icon:b,title:a.title,map:null};if(!g.clustering)b.map=e;h=new f.Marker(b);h.setShadow(c);d.markers.push(h);a.key&&(d.markerKeys[a.key]=h);var j;a.html&&(c={content:typeof a.html==="string"?g.html_prepend+
a.html+g.html_append:a.html,pixelOffset:a.infoWindowAnchor},g.log&&console.log("setup popup with data"),g.log&&console.log(c),j=new f.InfoWindow(c),f.event.addListener(h,"click",function(){g.log&&console.log("opening popup "+a.html);g.singleInfoWindow&&d.infoWindow&&d.infoWindow.close();j.open(e,h);d.infoWindow=j}));if(a.html&&a.popup)g.log&&console.log("opening popup "+a.html),j.open(e,h),d.infoWindow=j},_geocodeMarker:function(a,b,c){o+=1;var i=this;n.geocode({address:a.address},function(d,e){o-=
1;e===f.GeocoderStatus.OK?(i.data("gmap").opts.log&&console.log("Geocode was successful with point: ",d[0].geometry.location),h.processMarker.apply(i,[a,b,c,d[0].geometry.location])):i.data("gmap").opts.log&&console.log("Geocode was not successful for the following reason: "+e)})},addMarker:function(a){var b=this.data("gmap").opts;b.log&&console.log("putting marker at "+a.latitude+", "+a.longitude+" with address "+a.address+" and html "+a.html);var c=b.icon.image,i=new f.Size(b.icon.iconsize[0],b.icon.iconsize[1]),
d=new f.Point(b.icon.iconanchor[0],b.icon.iconanchor[1]),e=new f.Size(b.icon.infowindowanchor[0],b.icon.infowindowanchor[1]),g=b.icon.shadow,j=new f.Size(b.icon.shadowsize[0],b.icon.shadowsize[1]),k=d;a.infoWindowAnchor=e;if(a.icon){if(a.icon.image)c=a.icon.image;a.icon.iconsize&&(i=new f.Size(a.icon.iconsize[0],a.icon.iconsize[1]));a.icon.iconanchor&&(d=new f.Point(a.icon.iconanchor[0],a.icon.iconanchor[1]));a.icon.infowindowanchor&&new f.Size(a.icon.infowindowanchor[0],a.icon.infowindowanchor[1]);
if(a.icon.shadow)g=a.icon.shadow;a.icon.shadowsize&&(j=new f.Size(a.icon.shadowsize[0],a.icon.shadowsize[1]))}c=new f.MarkerImage(c,i,null,d);g=new f.MarkerImage(g,j,null,k);if(a.address){if(a.html==="_address")a.html=a.address;if(a.title=="_address")a.title=a.address;b.log&&console.log("geocoding marker: "+a.address);h._geocodeMarker.apply(this,[a,c,g])}else{if(a.html==="_latlng")a.html=a.latitude+", "+a.longitude;if(a.title=="_latlng")a.title=a.latitude+", "+a.longitude;b=new f.LatLng(a.latitude,
a.longitude);h.processMarker.apply(this,[a,c,g,b])}},removeAllMarkers:function(){var a=this.data("gmap").markers,b;for(b=0;b<a.length;b+=1)a[b].setMap(null),delete a[b];a.length=0},getMarker:function(a){return this.data("gmap").markerKeys[a]},fixAfterResize:function(a){var b=this.data("gmap");f.event.trigger(b.gmap,"resize");a&&b.gmap.panTo(new google.maps.LatLng(0,0));b.gmap.panTo(this.gMap("_getMapCenter",b.opts))}};j.fn.gMap=function(a){if(h[a])return h[a].apply(this,Array.prototype.slice.call(arguments,
1));else if(typeof a==="object"||!a)return h.init.apply(this,arguments);else j.error("Method "+a+" does not exist on jQuery.gmap")};j.fn.gMap.defaults={log:!1,address:"",latitude:null,longitude:null,zoom:3,markers:[],controls:{},scrollwheel:!0,maptype:google.maps.MapTypeId.ROADMAP,mapTypeControl:!0,zoomControl:!0,panControl:!1,scaleControl:!1,streetViewControl:!0,singleInfoWindow:!0,html_prepend:'<div class="gmap_marker">',html_append:"</div>",icon:{image:"http://www.google.com/mapfiles/marker.png",
iconsize:[20,34],iconanchor:[9,34],infowindowanchor:[9,2],shadow:"http://www.google.com/mapfiles/shadow50.png",shadowsize:[37,34]},onComplete:function(){},clustering:!1,fastClustering:!1,clusterCount:10,clusterSize:40}})(jQuery);
