	
	google.load("maps", "2.x");
	var main_url = 'http://onnepank.sinkovskiy.dev.modera.net/';
	var EDGE_COLOR = "#0000FF";
	var EDGE_WIDTH = 2;
	var EDGE_ALPHA = 0.8;

	var FILL_COLOR = EDGE_COLOR;
	var FILL_ALPHA = 0.2;

	var map;
	var geo;
	var pe;

	var addy = null

	var c   = null;
	var lls = new Array(0);
	var pxs = new Array(0);

	var mark = new Array(0);
	var fill = true;
	var poly = null;
	var map_loaded = false;
	var count = 0;
	var front = false;
	var found = false;
	var points = false;


function updateLink() {

	//var addyB = document.getElementById("addy_box");
	var directions = "<strong>Copy the html below to your site to include the map on your site.</strong><br />";
	var link = null;
	link  = "http://www.nirmalpatel.com/ourarea/v.html";
	link += "?";
	link += "a="  + addy;
	link += "&c=" + c.toUrlValue();
	link += "&f=" + fill;
	var temp = c.toUrlValue().split(',');
	
    
     
	if (lls.length > 2) {
		lls.push(lls[0]);
		var encoded = pe.dpEncode(lls);
		link += "&p=" + encoded.encodedPoints;
		link += "&l=" + encoded.encodedLevels;
		lls.pop();
		link = directions + '<pre>&lt;iframe width="400" height="300" id="ourarea" src="' + link + '"&gt;&lt;/iframe&gt;</pre>';
		//addyB.style.fontSize = "10pt";
	} else if (lls.length == 0) {
		//link = addyForm;
		//addyB.style.fontSize = "12pt;"
	} else if (lls.length == 1) {
		if (polyPts.length > 2) {
		var encoded = pe.dpEncode(polyPts);
		link += "&p=" + encoded.encodedPoints;
		link += "&l=" + encoded.encodedLevels;
		link = directions + '<pre>&lt;iframe width="400" height="300" id="ourarea" src="' +
		link + '"&gt;&lt;/iframe&gt;<pre>';
		
			//addyB.style.fontSize = "10pt";
		} else {
			link = null;
		}
	} else {
		link = "Add/remove a point."
		//addyB.style.fontSize = "12pt;"
	}
// temporary hint
	if (link) {
		var coordinates = '';
		for (i in lls) {
			if (i == 'remove' || i == 'indexOf') continue;
			coordinates += lls[i].y + ',' + lls[i].x + ';'; 
		}
		$("[name=a_points]").val('');
		$("[name=area_points]").val(coordinates);
		$("[name=a_points]").val(coordinates);
		$("[name=lat]").val(temp[0]);
		$("[name=long]").val(temp[1]);

	}

}


	//Thank you Bill Chadwick 
    //http://groups.google.md/group/Google-Maps-API/msg/3e0cb9c46ddace6d                
    function pointAtDistAndBearing(startingPoint, distance, azimuthDegrees) {
        var latr = startingPoint.lat() * Math.PI / 180.0;
        var lonr = startingPoint.lng() * Math.PI / 180.0;

        var coslat = Math.cos(latr);
        var sinlat = Math.sin(latr);
        var az = azimuthDegrees* Math.PI / 180.0;
        var cosaz = Math.cos(az);
        var sinaz = Math.sin(az);
        var dr = distance / 6378137.0; // distance in radians using WGS84 Equatorial Radius in metres
        var sind = Math.sin(dr);
        var cosd = Math.cos(dr);

        return new GLatLng(Math.asin((sinlat * cosd) + (coslat *
            sind * cosaz)) * 180.0 / Math.PI,
            (Math.atan2((sind * sinaz), (coslat * cosd) - (sinlat *
                sind * cosaz)) + lonr) * 180.0 / Math.PI);
    }

    function circumferenceAsLatLng(center, radius) {

        polyPts = new Array(0);
        var numWedges = 36;
        var degreesPerWedge = 360.0 / numWedges;
        for (var i = 0; i <= numWedges; i++) {
            polyPts.push(pointAtDistAndBearing(center, radius, i * degreesPerWedge));
        }

        return polyPts;

    }

	function getFillLevel() {
		if (fill) {return FILL_ALPHA;}
		return 0.0
	}


	function redrawPolygon() {
		if (!c) {return;}

		if (poly) {
			map.removeOverlay(poly);
		}

		var tempPoly = null;
		if (lls.length > 1) {
			lls.push(lls[0]);
			tempPoly = new google.maps.Polygon(lls,EDGE_COLOR, EDGE_WIDTH, EDGE_ALPHA, FILL_COLOR, getFillLevel());
			lls.pop();
		} else if (lls.length == 1) {
			var radius = c.distanceFrom(lls[0]);
			polyPts = circumferenceAsLatLng(c, radius);
			tempPoly = new google.maps.Polygon(polyPts,EDGE_COLOR, EDGE_WIDTH, EDGE_ALPHA, FILL_COLOR, getFillLevel());
		}

		if (tempPoly) {
			map.addOverlay(tempPoly);
			poly = tempPoly;
		}
	}

	function relabelMarkers() {
		for (var i=0; i<mark.length; i++) {
			mark[i].array_index = i;
		}
	}


    function cl(o, p) {
    		if (!found) {
    			if (p.y != 0 && p.x) {
    				
    				c = p;
    			}
    			if (c) {
    				mainMarker(c);
					found = true;
				}
    			return;
    		}
            if (o && (o==poly) && (lls.length >= 3)) {
                    fill = !fill;
                    redrawPolygon();
                    updateLink();
                    return;
            }
            if (points) {
            	return;
            }
            if (count >= 4) {
            	return;
            }
            if (!c) {
            	return;
            } 

            var proxIndex = prox(p) + 1;

            /*var iconOptions = {};
            iconOptions.width = 32;
            iconOptions.height = 32;
            iconOptions.primaryColor = "#0493BCFF";
            iconOptions.cornerColor = "#7DB1D5FF";
            iconOptions.strokeColor = "#000000FF";
            var dragIcon = MapIconMaker.createMarkerIcon(iconOptions);*/
            var iconMap = new GIcon(G_DEFAULT_ICON);
			iconMap.image = main_url + 'img/area-marker.png';
			iconMap.shadow = main_url + 'img/gmap-shadow.png';
            iconMap.width = 15;
            iconMap.height = 30;
            
            var marker = new google.maps.Marker(p, {draggable:true, icon: iconMap});
            marker.array_index = proxIndex;
            google.maps.Event.addListener(marker, "drag", function() {
                    lls[this.array_index] = this.getLatLng();
                    pxs[this.array_index] = map.fromLatLngToDivPixel(this.getLatLng());
                    redrawPolygon();
                    updateLink();
            });
            google.maps.Event.addListener(marker, "dblclick", function() {
                    mark.splice(this.array_index, 1);
                    lls.splice(this.array_index, 1);
                    pxs.splice(this.array_index, 1);                        
					map.removeOverlay(this);
                    relabelMarkers();
                    redrawPolygon();
                    updateLink();
            });
            mark.splice(proxIndex, 0, marker)
            lls.splice(proxIndex, 0, p);
            pxs.splice(proxIndex, 0, map.fromLatLngToDivPixel(p));
            relabelMarkers();
			redrawPolygon();
            map.addOverlay(marker);

            updateLink();
            count++;
    }

	function distPtoL(px, l1, l2) {
		var dist;
		if (l1.x != l2.x) {
			var a = (l1.y - l2.y) / (l1.x - l2.x);	
			var b = l1.y - a * l1.x;
			dist = Math.abs(a*px.x + b - px.y) / Math.sqrt(a*a+1);
		} else {
			dist = Math.abs(px.x - l1.x);
		}
		var rl2 = Math.pow(l1.y - l2.y,2) + Math.pow(l1.x - l2.x,2);
		var ln2 = Math.pow(l1.y - px.y,2) + Math.pow(l1.x - px.x,2);
		var lnm12 = Math.pow(l2.y - px.y,2) + Math.pow(l2.x - px.x,2);
		var dist2 = Math.pow(dist,2);
		var calcrl2 = ln2 - dist2 + lnm12 - dist2;
		if (calcrl2 > rl2) {
			dist = Math.sqrt(Math.min(ln2,lnm12)); 
		}  
		return dist;
	}

	function prox(p) {
		var md = -1;
		var mn = -1;
		if (pxs.length > 1) {
			var px = map.fromLatLngToDivPixel(p);
			md = distPtoL(px, pxs[0], pxs[1]);
			mn = 0;
			for (var n=0; n<pxs.length; n++) {
				var o = (n+1) % pxs.length;
				var dist = distPtoL(px, pxs[n], pxs[o]);
				if (dist < md) {
					md = dist;
					mn = n;
				}
			}	
		}
		//alert(mn); alert(pxs);
		return mn;
	}

	function openInstructions() {
		if (c) {
			info  = "<div style='text-decoration: underline'>" + addy + "</div>";
			info += "<ul>";
			info += "<li>Click on the map to drop markers and define your area.</li>";
			info += "<li>Drag markers to fix mistakes.</li>";
			info += "<li>Double click markers to remove.</li>";
			info += "<li>Click inside to toggle filling.</li>";
			info += "<li>Copy the html above to your page.</li>";
			info += "</ul>";
			map.openInfoWindowHtml(c, info, {maxWidth: 300});
		}
	}
	
	function mainMarker(point) {
		var temp = point.toUrlValue().split(',');
		$("[name=lat]").val(temp[0]);
		$("[name=long]").val(temp[1]);
		map.clearOverlays();
		map.setCenter(point, 7);
		var iconMap = new GIcon(G_DEFAULT_ICON);
		iconMap.image = main_url + 'img/main-marker.png';
		iconMap.shadow = main_url + 'img/gmap-shadow.png';
		var marker = new google.maps.Marker(point, {draggable:true, icon:iconMap});					
		GEvent.addListener(marker, 'drag', markerDrag);
		//GEvent.addListener(marker, 'dragstart', markerDragStart);
		//GEvent.addListener(marker, 'dragend', markerDragEnd);
		GEvent.addListener(marker, "dragend", function(){
   				$.ajax({
   					type: "POST",
   					url: "dragend.php",
   					data: "lid=" + getQueryVariable("copyto") + "&id=" + getQueryVariable("id") + "&lat=" + marker.getPoint().lat() + "&lng=" + marker.getPoint().lng() + "&act=ins",
   					success: function(msg){
   						addy = msg;
   					}
 				});

			});
		map.addOverlay(marker);
	}
	
	function getQueryVariable(variable) {
  		var query = window.location.search.substring(1);
  		var vars = query.split("&");
  		for (var i=0;i<vars.length;i++) {
  		  var pair = vars[i].split("=");
  		  if (pair[0] == variable) {
  		    return pair[1];
  		  }
  		} 
	} 		
	
	function sa() {
		if (addy == ' ') {
			return false;
		}
		if (geo) {
			points = false;
			mark = new Array(0);
			lls = new Array(0);
			map.clearOverlays();
	        geo.getLatLng(addy, function(p) {
				c = p;
				if (c) {
					mainMarker(c);
					found = true;
					
				} else {
					$("[name=lat]").val('');
					$("[name=long]").val('');
					found = false;
					map.setCenter(new google.maps.LatLng(58.595272, 25.013607), 7);
					alert("Address: \"" + addy + "\" not found. ");
				}
			});
		} else {
			alert("No geocoder installed. Try again later.")
		}

		return false;	
	}
	
	
	function markerDrag() {
		points = true;
	}
	function markerDragEnd(latlng) {
		map.removeOverlay(poly);
		var x = latlng.x - c.x;
		var y = latlng.y - c.y;
		var p;
		var mapPoints = new Array(0);
		/*lls = new Array(0);
		for (i in mark) {
			if (i == 'remove' || i == 'indexOf') continue;
			temp  = mark[i].getLatLng();
			p = new google.maps.LatLng(temp.x + x, temp.y + y);
			mark[i].hide();
			mapPoints[i] = p;
			
		}
		mark = new Array(0);
		for (i in mapPoints) {
			if (i == 'remove' || i == 'indexOf') continue;
			cl(null, mapPoints[i]);
		}
        updateLink();*/
		for (i in lls) {
			if (i == 'remove' || i == 'indexOf') continue;
			lls[i].y  = lls[i].y + y;
			lls[i].x  = lls[i].x + x;
			p = new google.maps.LatLng(lls[i].x , lls[i].y);
			pxs[i] = map.fromLatLngToDivPixel(p);
		}
        redrawPolygon();
        updateLink();
        c = latlng;
	}
	function markerDragStart(latlng) {
		c = latlng;
	}
	function load() {
	    if (google.maps.BrowserIsCompatible()) {
	        map = new google.maps.Map2(document.getElementById("m"));
	        map.setCenter(new google.maps.LatLng(58.595272, 25.013607), 7.0);
	    //	map.enableScrollWheelZoom();
		//	map.addControl(new google.maps.MapTypeControl());
			map.addControl(new google.maps.SmallZoomControl3D()); 
			pe = new PolylineEncoder();
			geo = new google.maps.ClientGeocoder();
			google.maps.Event.addListener(map, "click", cl);
			map.disableDragging();
    	}
	    if (!front) {
	    	sa();
	    }
	}
