/*
 *		
 *		Copyright (C) 2009 Tama Network Center Ltd.
 *		
 *		http://mosimosi.biz/
 *		
 *		
 *		
 *		
 */

(function($) {
	
	var plugin_name='gmap';
	
	$.fn[plugin_name]=function(JSON,PARAMS){
		
		var ELEMENTS=this;
		var ELEMENT;
		
		var MAP;
		var MARKER=[];
		var CENTER={};
		var MIN={lat:999,lng:999}
		var MAX={lat:0,lng:0};
		var FLAG=0;
		var ADDRESS=[];
		
		var DEFAULTS={
			'lat':35.62493079773405,
			'lng':139.42418575286865,
			'zoom':12,
			'info':'',
			'edit':false
		};
		
		if(PARAMS){
			PARAMS=$.extend({
				'toAddress':'table',
				'toMarker':'table a[href^="javascript"]'
			},PARAMS);
		}
		
		var initialize=function(){
			MAP=new GMap2(document.getElementById($(ELEMENT).attr('id')));
			MAP.addControl(new GLargeMapControl());
			MAP.addControl(new GOverviewMapControl(new GSize(125,125)));
			MAP.enableContinuousZoom();
		};
		
		var geocoding=function(v){
			var g=new GClientGeocoder();
			g.getLatLng(v.address,function(r){
				if(r){
					marking(r.lat(),r.lng(),v.info,v.edit);
					setCenterParams(r.lat(),r.lng());
					MAP.panTo(new GLatLng(r.lat(),r.lng()));
				}
			});
		}
		
		var setCenterParams=function(lat,lng){
			MIN.lat=Math.min(MIN.lat,lat);
			MAX.lat=Math.max(MAX.lat,lat);
			MIN.lng=Math.min(MIN.lng,lng);
			MAX.lng=Math.max(MAX.lng,lng);
			CENTER.lat=(MIN.lat+MAX.lat)/2;
			CENTER.lng=(MIN.lng+MAX.lng)/2;
			CENTER.zoom=MAP.getBoundsZoomLevel(
				new GLatLngBounds(
					new GLatLng(MIN.lat,MIN.lng),
					new GLatLng(MAX.lat,MAX.lng)
				)
			);
			++FLAG;
		}
		
		var marking=function(y,x,i,e){
			var p=new GLatLng(y,x);
			var m=new GMarker(p,{draggable:e});
			if(i) m.info=i;
			MARKER.push(m);
			m.id=MARKER.length-1;
			GEvent.addListener(m,'click',function(){
				MAP.panTo(p);
				//if(m.info) m.openInfoWindowHtml(m.info);
				if(m.info){
					var html=document.createElement('div');
					if(ADDRESS[m.id]){
						$(html)
							.append('<a>'+m.info+'</a>')
							.children()
							.attr('href','javascript:void(0);')
							.addClass('checkAddress')
							.click(function(){
								$.scrollTo(ADDRESS[m.id]);
							});
					}else{
						$(html).html(m.info);
					}
					m.openInfoWindowHtml(html);
				}
			});
			if(e){
				GEvent.addListener(m,'dragend',function(){
					p=m.getPoint();
					setHiddenValue(p);
					MAP.panTo(new GLatLng(p.lat(),p.lng()));
				});
				GEvent.addListener(MAP,'zoomend',function(){
					setHiddenValue(MARKER[0].getPoint());
				});
			}
			MAP.addOverlay(m);
		}
		
		var setHiddenValue=function(p){
			var e='input#Address';
			if(!p) p=MAP.getCenter();
			$(e+'Lat').val(p.lat());
			$(e+'Lng').val(p.lng());
			$(e+'Zoom').val(MAP.getZoom());
			var a=MAP.getBounds();
			sw=a.getSouthWest();
			ne=a.getNorthEast();
			$(e+'SwX').val(sw.x);
			$(e+'SwY').val(sw.y);
			$(e+'NeX').val(ne.x);
			$(e+'NeY').val(ne.y);
		}
		
		var anchorAction=function(){
			$(PARAMS.toMarker).click(function(){
				var str=$(this).attr('href');
				var n=str.match(/\d+/);
				var m=MARKER[n];
				GEvent.trigger(m,'click');
				$.scrollTo(ELEMENT);
			}).each(function(){
				/*
				$(this).parents(PARAMS.toAddress).each(function(){
					var id=$(this).attr('id');
					if(id){
						ADDRESS.push('#'+id);
					}else{
						var id=randomString();
						$(this).attr('id',id);
						ADDRESS.push('#'+id);
					}
				});
				*/
				$(PARAMS.toAddress).each(function(){
					var id=$(this).attr('id');
					if(id){
						ADDRESS.push('#'+id);
					}else{
						var id=randomString();
						$(this).attr('id',id);
						ADDRESS.push('#'+id);
					}
				});
			});
		}
		
		ELEMENTS.each(function(){
			ELEMENT=this;
			initialize();
			
			$('input#AddressStreet').blur(function(){
				if($(this).val()){
					MAP.clearOverlays();
					MARKER=[];
					geocoding({'address':$(this).val(),'edit':true});
				}
			});
			
			$.each(JSON,function(k,v){
				if(v.address){
					geocoding(v);
				}else{
					if(!v.lat || !v.lng){
						$.each(DEFAULTS,function(key,value){
							if(value) v[key]=value;
						});
					}
					marking(v.lat,v.lng,v.info,v.edit);
					setCenterParams(v.lat,v.lng);
				}
			});
			var timer=setInterval(function(){
				if(FLAG>=JSON.length){
					if(JSON.length==1 && JSON[0]['zoom']) CENTER.zoom=parseInt(JSON[0]['zoom']);
					MAP.setCenter(new GLatLng(CENTER.lat,CENTER.lng),CENTER.zoom);
					clearInterval(timer);
				}
			},100);
			
			anchorAction();
		});
		
		return this;
	};
	
	
})(jQuery);


