/* jQuery kgoogleMap Copyright Dylan Verheul <dylan@dyve.net>
 * Licensed like jQuery, see http://docs.jquery.com/License
 */
(function($) {
$.kgoogleMap = {
	maps: {},
	markers: {},//lista wszystkich markerow
	bounds: {}, //tablica z lista markerow uzywana do wyliszania zoomu i centrowania mapy
	mm: {},//markermanager
	marker: function(m) {
		if (!m) {
			return null;
		} else if (m.type=='point') {
			var icon = new GIcon(G_DEFAULT_ICON);
			if (m.icon['w']>0 && m.icon['h']>0) icon.iconSize = GSize(m.icon['w'],m.icon['h']);
			//alert(m.icon['image']);
			if (m.icon['image']!='') icon.image = m.icon['image'];
			if (m.icon['shadow']!='') icon.shadow = m.icon['shadow'];//http://maps.google.com/mapfiles/kml/pal2/icon13s.png";
			options = {icon:icon};
			var marker = $.kgoogleMap.createMarker(m.lat, m.lng,m.txt,options);
			return {marker:marker,info:m};
		} else if (!m.type) {
			return $.kgoogleMap.marker($.kgoogleMap.readFromGeo(m));
		} else {
			return {marker:null,info:m};
		}
	},
	readFromGeo: function(elem) {
		type = $(elem).attr('title');
		//alert(type);
		switch (type){
			case 'point'://punkt na mapie
				//alert($(elem).attr('title'));
				var latElem = $(".geo_lat", elem)[0];
				var idElem = $(".geo_id", elem)[0];
				var lngElem = $(".geo_lng", elem)[0];
				var txtElem = $(".geo_desc", elem)[0];
				var icon_imageElem = $(".geo_icon_image", elem)[0];
				var icon_shadowElem = $(".geo_icon_shadow", elem)[0];
				var icon_widthElem = $(".geo_icon_width", elem)[0];
				var icon_heightElem = $(".geo_icon_height", elem)[0];
				var zoomMinElem = $(".geo_zoom_min", elem)[0];
				var zoomMaxElem = $(".geo_zoom_max", elem)[0];
				if (latElem && lngElem) {
					//return { lat:parseFloat($(latElem).attr("title")), lng:parseFloat($(lngElem).attr("title")), txt:$(elem).attr("title") }
					return {type:'point',
						lat:parseFloat($(latElem).attr("title")), 
						lng:parseFloat($(lngElem).attr("title")), 
						txt:$(txtElem).html(),
						id:$(idElem).attr('title'),
						zoomMin:parseInt($(zoomMinElem).attr('title')),
						zoomMax:parseInt($(zoomMaxElem).attr('title')),
						icon:{	image:$(icon_imageElem).attr('href'),
							shadow:$(icon_shadowElem).attr('href'),
							w:parseInt($(icon_widthElem).attr('title')),
							h:parseInt($(icon_heightElem).attr('title'))} 
						}//todo: icon
				} else {
					return null;
				}
			break;
			case 'center':
				var latElem = $(".geo_lat", elem)[0];
				var lngElem = $(".geo_lng", elem)[0];
				return {type:'center',
					lat:parseFloat($(latElem).attr('title')),
					lng:parseFloat($(lngElem).attr('title'))}
			break;
			case 'zoom':
				var zoomElem = $(".geo_zoom", elem)[0];
				return {type:'zoom',zoom:$(zoomElem).attr('title')}
			break;
			case 'type':
				var typeElem = $(".geo_type", elem)[0];
				return {type:'type',value:$(typeElem).attr('title')}
			break;
			case 'polygon':
				return {type:'polygon'}//todo
			break;
			case 'polyline':
				return {type:'polyline'}//todo
			break;
			case 'kml':
				var kmlElem = $(".geo_kml", elem)[0];
				var autozoomElem = $(".geo_autozoom", elem)[0];
				return {type:'kml',
					url:$(kmlElem).attr('href'),
					autozoom:($(autozoomElem).attr('title')=="1")
					}
			break;
			case 'xml':
				var xmlElem = $(".geo_xml", elem)[0];
				return {type:'xml',
					url:$(xmlElem).attr('href')
					}
			break;
		}
	},
	mapNum: 1,

	//! piszemy wlasna funckje getcript bo standardowa jQuery.getScript nie keszuje skryptow
	getScript: function(url, callback, cache){ 
		$.ajax({ type: "GET", url: url, async:true, success: callback, dataType: "script", cache: cache }); 
	},
	//! Wyskonuje funckje functiontoexecute ale wczesniej wczytuje API GoogleMaps
	execute : function(functiontoexecute){
			var jsmmaker = "_kengine/javascript/jquery/kgooglemaps/markermanager.js";
			google.load('maps', '2',{callback:function(){$.kgoogleMap.getScript(jsmmaker,functiontoexecute,true)}});
	},

	//tworzy marker
	createMarker : function(lat,lng,html,options){
		//alert('a');
		var marker = new GMarker(new GLatLng(lat,lng),options);
		if (html) GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});
		//alert(marker);
		return marker;
	},

	//Laduje dane z pliku XML
	loadXML : function(mapid,xmlurl,autocenter,autozoom){
		//alert(xmlurl);
		var request = GXmlHttp.create();
		request.open("GET", xmlurl, true);
		var thisid = mapid;
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				var xmlDoc = GXml.parse(request.responseText);
				var markers = xmlDoc.documentElement.getElementsByTagName("marker");
				// obtain the array of markers and loop through it
				for (var i = 0; i < markers.length; i++) {
					// obtain the attribues of each marker
					//$.kgoogleMap.maps[thisid].setZoom(0);
					var lat = parseFloat(markers[i].getAttribute("lat"));
					var lng = parseFloat(markers[i].getAttribute("lng"));
					var html = markers[i].getAttribute("html");
					var label = markers[i].getAttribute("label");
					var markerid = markers[i].getAttribute("id");
					var zoommin = parseInt(markers[i].getAttribute("zoommin"));
					var zoommax = parseInt(markers[i].getAttribute("zoommax"));
					var markericon = {};
					markericon['h'] = parseInt(markers[i].getAttribute("icon_h"));
					markericon['w'] = parseInt(markers[i].getAttribute("icon_w"));
					markericon['image'] = markers[i].getAttribute("icon_image");
					markericon['shadow'] = markers[i].getAttribute("icon_shadow");
					var icon = new GIcon(G_DEFAULT_ICON);
					if (markericon['w']>0 && markericon['h']>0) icon.iconSize = GSize(markericon['w'],markericon['h']);
					if (markericon['image']!=null) icon.image = markericon['image'];
					if (markericon['shadow']!=null) icon.shadow = markericon['shadow'];//http://maps.google.com/mapfiles/kml/pal2/icon13s.png";
					//icon.image = "http://www.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png";
					//icon.image = "_my/img/gmap/icons/icon1.png";
					options = {icon:icon};
					var marker = $.kgoogleMap.createMarker(lat,lng,html,options);
					//$.kgoogleMap.maps[thisid].addOverlay(marker);
					//alert(thisid);
					$.kgoogleMap.mm[thisid].addMarker(marker,zoommin,zoommax);		
					//$.kgoogleMap.mm[thisid].addMarker(marker,0,17);		
					$.kgoogleMap.mm[thisid].refresh();
					$.kgoogleMap.markers[markerid] = marker;
					$.kgoogleMap.bounds[thisid].extend(marker.getPoint());
				}
				
			
				// ========= Now process the polylines ===========
				var lines = xmlDoc.documentElement.getElementsByTagName("line");
				// read each line
				for (var a = 0; a < lines.length; a++) {
					// get any line attributes
					var colour = lines[a].getAttribute("colour");
					var width  = parseFloat(lines[a].getAttribute("width"));
					// read each point on that line
					var points = lines[a].getElementsByTagName("point");
					var pts = [];
					for (var i = 0; i < points.length; i++) {
					pts[i] = new GLatLng(parseFloat(points[i].getAttribute("lat")),
								parseFloat(points[i].getAttribute("lng")));
					}
					$.kgoogleMap.maps[thisid].addOverlay(new GPolyline(pts,colour,width));
				}
				// ================================================           
				$.kgoogleMap.mm[thisid].refresh();
				if (autozoom) $.kgoogleMap.autoZoom(thisid);
				if (autocenter) $.kgoogleMap.autoCenter(thisid);
				
			}
		
		}
		request.send(null);
	},

	//Laduje plik KML. Plik musi byc w internecie
	loadKML : function(mapid,kmlurl,autozoom){
		var kml = new GGeoXml(kmlurl);
      		$.kgoogleMap.maps[mapid].addOverlay(kml);
		//alert(autozoom);
		if (autozoom) kml.gotoDefaultViewport($.kgoogleMap.maps[mapid]); 	
	},

	autoZoom : function(mapid){
		$.kgoogleMap.maps[mapid].setZoom($.kgoogleMap.maps[mapid].getBoundsZoomLevel($.kgoogleMap.bounds[mapid]));
	},

	autoCenter : function(mapid){
		$.kgoogleMap.maps[mapid].setCenter($.kgoogleMap.bounds[mapid].getCenter());	
	},

	searchAddress : function(address,resultmap,options){
		geocoder = new GClientGeocoder();	
		if (geocoder) {
			geocoder.getLatLng(
			address,
			function(point) {
			if (!point) {
			alert(address + ": nie znaleziono...");
			} else {
				resultmap.clearOverlays();
				resultmap.setCenter(point, 15);
				var marker = new GMarker(point, {draggable: true});
				GEvent.addListener(marker, "dragstart", function() {resultmap.closeInfoWindow();});
				GEvent.addListener(marker, "dragend", function() {resultfunction(marker);});
				resultmap.addOverlay(marker);
				marker.openInfoWindowHtml(address);
				resultfunction(marker);	
			}
			}
			);
		}
	}
};

//! Jesli bezposrednio po uzyciu kgooglweMap wykonujemy jakas operacje na mapie to najlepiej skorzystac z callback
$.fn.kgoogleMap = function(lat, lng, zoom, options,callback) {
	var options = options;
	var lat = lat;
	var lng = lng;
	var zoom = zoom;
	var thisobj = this;
	//alert(this);
	$.kgoogleMap.execute(function(){
		if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;
		// Default values make for easy debugging
		if (lat == null) lat = 0;
		if (lng == null) lng = 0;
		if (!zoom) zoom = 0;
	
		// Sanitize options
		if (!options || typeof options != 'object')	options = {};
		options.mapOptions = options.mapOptions || {};
		options.markers = options.markers || [];
		options.controls = options.controls || {};
		options.types	= options.types || [G_HYBRID_MAP,G_NORMAL_MAP,G_PHYSICAL_MAP,G_SATELLITE_MAP];
			// Map all our elements
			thisobj.each(function() {
				//if ($.kgoogleMap.maps[this.id]!=null) return;//nie nadpisjemy istniejacej mapy
				// Make sure we have a valid id
				//alert(this.id);
				if (!this.id) this.id = "gMap" + $.kgoogleMap.mapNum++;
				//if ($.kgoogleMap.maps[this.id]!=undefined) delete $.kgoogleMap.maps[this.id];

				// Create a map and a shortcut to it at the same time
				delete $.kgoogleMap.bounds[this.id];
				delete $.kgoogleMap.mm[this.id];
				delete $.kgoogleMap.maps[this.id];
				if ($.kgoogleMap.maps[this.id]==undefined){
					//alert(this.id);
					//$.kgoogleMap.maps[this.id] = new GMap2($('#'+this.id).get(0), options.mapOptions);
					$.kgoogleMap.maps[this.id] = new GMap2(this, options.mapOptions);
					var thisid_type = this.id;
					options.types.each(function(t){
						$.kgoogleMap.maps[thisid_type].addMapType(t);
					});//
				}
				//alert('tworze mape');
				// Center and zoom the map
				// Add controls to our map
				for (var i = 0; i < options.controls.length; i++) {
					var c = options.controls[i];
					//alert(c);
					eval("$.kgoogleMap.maps[this.id].addControl(new " + c + "());");
				}
				
				$.kgoogleMap.maps[this.id].setCenter(new GLatLng(lat, lng), zoom);
				// If we have markers, put them on the map
				$.kgoogleMap.mm[this.id] = new MarkerManager($.kgoogleMap.maps[this.id]);//przechowalnia markerow ktora uwzglednia widocznosc markerow na danym zoomie
				$.kgoogleMap.bounds[this.id] = new GLatLngBounds();
				//alert(this.id);
				
				var marker = null;
				var set_center = false;
				var set_zoom = false;
				for (var i = 0; i < options.markers.length; i++) {
					markerinfo = $.kgoogleMap.marker(options.markers[i]);
					if (markerinfo==null) continue;
					//alert(markerinfo['info']['type']);
					
					switch(markerinfo['info']['type']){
						case 'center'://centruje mape
							set_center = true;
							$.kgoogleMap.maps[this.id].setCenter(new GLatLng(markerinfo['info']['lat'], markerinfo['info']['lng']));
						break;
						case 'zoom'://powiekszenie mapy
							set_zoom=true;
							$.kgoogleMap.maps[this.id].setZoom(markerinfo['info']['zoom']);
						break;
						case 'type'://typ mapy
							{
								//alert(markerinfo['info']['value']);
								switch(markerinfo['info']['value']){
									case 'hybrydowa':
									case 'hybrid':$.kgoogleMap.maps[this.id].setMapType(G_HYBRID_MAP);break;
									case 'satelitarna':
									case 'satellite':$.kgoogleMap.maps[this.id].setMapType(G_SATELLITE_MAP);break;
									case 'normalna':
									case 'normal':$.kgoogleMap.maps[this.id].setMapType(G_NORMAL_MAP);break;
									case 'fizyczna':
									case 'physical':$.kgoogleMap.maps[this.id].setMapType(G_PHYSICAL_MAP);break;
								}
								
							}
						break;
						case 'point'://punkt
							info = markerinfo['info'];
							if (marker = markerinfo['marker']) {
								$.kgoogleMap.markers[info.id] = marker;
								$.kgoogleMap.bounds[this.id].extend(marker.getPoint());
								if (info.zoomMax>17) info.zoomMax=17;
								if (info.zoomMin>17) info.zoomMin=17;
								$.kgoogleMap.mm[this.id].addMarker(marker,info.zoomMin,info.zoomMax);		
							}
							//$.kgoogleMap.mm[this.id].refresh();
						break;
						case 'polygon':
							//alert('polygon!');
							var polyline = new GPolyline([
							new GLatLng(120.4419, -122.1419),
							new GLatLng(0.4519, -122.1519),
							new GLatLng( 20.4619, 80.1819)
							], "#FF0000", 10);
							$.kgoogleMap.maps[this.id].addOverlay(polyline);
						break;
						case 'kml':
							$.kgoogleMap.loadKML(this.id,markerinfo['info']['url'],(markerinfo['info']['autozoom']));
						break;
						case 'xml':
							$.kgoogleMap.loadXML(this.id,markerinfo['info']['url'],true,true);
						break;
						default:
					}
				}
				$.kgoogleMap.mm[this.id].refresh();
				if (!set_center) $.kgoogleMap.autoCenter(this.id);
				if (!set_zoom) $.kgoogleMap.autoZoom(this.id);
			});
		if ($.isFunction(callback)) callback(thisobj);
		});//execute
		return this;
}

//Automatyczne centrowanie mapy
$.fn.kgoogleMapAutoCenter = function (){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			//alert($.kgoogleMap.bounds[this.id].getCenter());
			$.kgoogleMap.autoCenter(this.id);
		});
	});
	return this;
}

$.fn.kgoogleMapSetCenter = function (lat,lng,zoom){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.maps[this.id].setCenter(new GLatLng(lat, lng), zoom);	
		});
	});
	return this;
}

$.fn.kgoogleMapSetZoom = function (zoom){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.maps[this.id].setZoom(zoom);	
		});
	});
	return this;
}


//Automatyczny zooom
$.fn.kgoogleMapAutoZoom = function (){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.autoZoom(this.id);
		});
	});
	return this;
}

//! Wczytuje plik KML. Plik musi byc publicznie dostepny w internecie.
$.fn.kgoogleMapLoadKML = function(kmlurl,autozoom){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.loadKML(this.id,xmlurl,autozoom);
		});
	});
	return this;
}

//! Wczytuje punkty i linie z pliku XML. Dziala tez lokalnie
$.fn.kgoogleMapLoadXML = function(xmlurl,autocenter,autozoom){
	//if (!$.kgoogleMap.APIloaded) return this;
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.loadXML(this.id,xmlurl,autocenter,autozoom);
		});
	});
	return this;
}

//! Zwraca tablice z mapami gogle. Mozna sie do nich dobierac bezposrednio
$.fn.kgoogleMapGetMaps = function(){
	var tab = [];
	this.each(function() {
		if ($.kgoogleMap.maps[this.id]!=undefined)
			tab.push($.kgoogleMap.maps[this.id]);
	}
	);
	return tab;
}

//! Sprawdza czy mapa jest zaladowana. Zwraca true|false.
$.fn.kgoogleMapIsLoaded = function(){
	var result = (this.length>0);
	//alert(this.length);
	this.each(function() {
		if ($.kgoogleMap.maps[this.id]!=undefined){
			//alert('abcd');
			//alert($.kgoogleMap.maps[this.id]);
			result = result && $.kgoogleMap.maps[this.id].isLoaded();
			//result = result && $.kgoogleMap.maps[this.id].isLoaded();
		}else{
			result =false;
		}
	}
	);
	return result;
}

//! Czysci zawartos mapy, punkty i linie...
$.fn.kgoogleMapClearOverlays = function(){
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		thisobj.each(function() {
			$.kgoogleMap.mm[this.id].clearMarkers();
			$.kgoogleMap.maps[this.id].clearOverlays();
			delete $.kgoogleMap.mm[this.id];
			delete $.kgoogleMap.bounds[this.id];
			$.kgoogleMap.mm[this.id] = new MarkerManager($.kgoogleMap.maps[this.id]);
			$.kgoogleMap.bounds[this.id] = new GLatLngBounds();
			$.kgoogleMap.mm[this.id].refresh();
		});
	});
	return this;
}

$.fn.kgoogleMapSearch = function (options){
	//if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;	var options = options;
	var options = options || {};
	var thisobj = this;
	$.kgoogleMap.execute(function(){
		$('#google_search').remove();

		if (options.button!=null)
			$('body').append('<div id="google_search" class="light" title="SZUKAJ NA MAPIE" style="border:1px solid #d9e9c8"><div style="background:#666666;text-align:left;width:100%"><form onsubmit="javascript:return false" action="#" method="post"><label>miescowość, ulica:</label><input type="text" name="search" value="" /><input type="submit" value="szukaj" /></form></div><div class="map" style="width:100%;height:300px"></div><div style="background:#666666"><label>Glat,Glng:</label><input style="background:#666666;border:none;width:300px;margin:0px;color:white;font-weight:bold;font-size:13px" readonly="readonly" class="result" value="" /></div><div style="text-align:right;background:transparent"><input type="button" value="' + options.button + '" /></div></div>');
		else
			$('body').append('<div id="google_search" class="light" title="SZUKAJ NA MAPIE" style="border:1px solid #d9e9c8"><div style="background:#666666;text-align:left;width:100%"><form onsubmit="javascript:return false" action="#" method="post"><label>miescowość, ulica:</label><input type="text" name="search" value="" /><input type="submit" value="szukaj" /></form></div><div class="map" style="width:100%;height:300px"></div><div style="background:#666666"><label>Glat,Glng:</label><input style="background:#666666;border:none;width:300px;margin:0px;color:white;font-weight:bold;font-size:13px" readonly="readonly" class="result" value="" /></div><div style="text-align:right;background:transparent"></div></div>');

		$('#google_search').dialog({minHeight:450,maxHeight:450,height:450,width:500,minWidth:500});
		var searchmap = new GMap2($('#google_search div.map').get(0));
		searchmap.setCenter(new GLatLng(0,0),2);
		searchmap.addControl(new GSmallMapControl()); 
		searchmap.addControl(new GOverviewMapControl());    
		searchmap.addControl(new GScaleControl());    
		searchmap.enableContinuousZoom();  
		searchmap.enableDoubleClickZoom(); 
		resultfunction = function(marker){$('#google_search input.result').attr("value",marker.getPoint().lat() + "," + marker.getPoint().lng())};
		if (options.defaultaddress!=undefined && options.defaultaddress!=null) $.kgoogleMap.searchAddress(options.defaultaddress,searchmap,resultfunction);
		$('#google_search form ').bind('submit',function(){$.kgoogleMap.searchAddress($('#google_search form input[type=text]').attr('value'),searchmap,resultfunction)})

	});
	return this;
}	

})(jQuery);

