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