 //<![CDATA[
		
	var chset = "0123456789BCDFGHJKLMNPQRSTVWXZ- ";
	function minmax(s,flag)
	{
		var i=0;
		var j=0;
		var slen = s.length;
		var r=0;
		var d=1;
		for(i=0;i<slen;i++) {
			d = d * 30;
			for(j=0;j<30;j++) {
				if(s.charAt(i) == chset.charAt(j)) {
					r = r + j / d;
				}
			}
		}
		if(flag == 1) r = r + 1.0 / d;
		return r;
	}

	function tostr(latorlon, naclev)
	{
		//alert(latorlon);
		var x = new Array(naclev);
		var i = 0;
		var tem = (latorlon * 30);
		var j = 0;
		for(i=0;i<naclev;i++)
		{
			x[i] = Math.floor(tem);
			//alert(x[i]);
			tem = (tem - x[i]) * 30;
		}
		var s = "";
		for(i=0;i<naclev;i++)
		{
			s += chset.charAt(x[i]);
			//alert(s);
		}
		return s;
	}
	
	function toNAC(point)
	{
		var dlng = 1.0*point.lng();
		var dlat = 1.0*point.lat();
		var zlng = (dlng+180)/360;
		var zlat = (dlat+90)/180;
		var nac = tostr(zlng, 5) + ' ' + tostr(zlat, 5);
		return nac;
	}

	function getNACBounds(nac)
	{	
		var n = nac.indexOf(' ');
		var lonw = nac.substr(0, n);
		var lone = lonw;
		var lats = nac.substr(n+1, nac.length - 1);
		var latn = lats;
		var m = lonw.indexOf('-');
		if(m > 0)
		{
			lonw = lonw.substr(0,m);
			lone = lone.substr(0,m-1) + lone.charAt(m+1);
		}
		var m_lonw = 360 * minmax(lonw, 0) - 180;
		var m_lone = 360 * minmax(lone, 1) - 180;
		if((m_lonw > m_lone) && (m > 1)) 
		{
			m_lone = m_lone + 360 / Math.pow(30, m - 1);
			if( m_lone >= 180) m_lone = m_lone - 360;
		}
		m = lats.indexOf('-');
		if(m > 0) 
		{
			lats = lats.substr(0, m);
			latn = latn.substr(0, m-1) + latn.charAt(m+1);
		}
		var m_lats = 180 * minmax(lats, 0) - 90;
		var m_latn = 180 * minmax(latn, 1) - 90;
		if(m_lats > m_latn) 
		{
			if(m > 1) m_latn = m_latn + 180 / Math.pow(30, m - 1);
			if((m_latn > 90) || (m < 2)) 
			{
				return false;
			}
		}
		sw = new GLatLng(m_lats, m_lonw, true);
		ne = new GLatLng(m_latn, m_lone, true);
		bs = new GLatLngBounds(sw, ne);
		cp = bs.getCenter();
		return true;
	}

	var map, addr, cnac, cp, bs, sw, ne, zoom;
    function load() 
	{
      if (GBrowserIsCompatible()) 
	  {
		zoom = 19;
		cnac = "8KDB PGFD";
		getNACBounds(cnac);

        map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		DrawNAC(true);

 		GEvent.addListener(map, "mousemove", function(point){
			showNAC(point, true);
		});

 		GEvent.addListener(map, "mouseout", function(){
			showCenterNAC();
		});

 		GEvent.addListener(map, "moveend", function(){
		});

 		GEvent.addListener(map, "zoomend", function(){
			zoom = map.getZoom();
		});

 		GEvent.addListener(map, "dragend", function(){
			RedrawNAC();
		});

 		GEvent.addListener(map, "click", function(overlay, point){
			cp = point;
			cnac = toNAC(cp);
			getNACBounds(cnac);
			DrawNAC(false);
		});

		
		addr = "8-P 1-X";	
		if(addr.length > 0)
		{
			getNAC(addr);
		}
      }
    }

	function showCenterNAC()
	{
		point = map.getCenter();
		showNAC(point, false);
	}

	function RedrawNAC()
	{
		cp = map.getCenter();
		cnac = toNAC(cp);
		getNACBounds(cnac);
		DrawNAC(false);
	}

	function showNAC(point, flag)
	{
		//var nac = toNAC(point);
		//var v = 'At the map center: \tNAC: ';
		//if(flag) v = 'At the cursor point: \tNAC: ';
		//v = v + nac + '     \tLongitude: ' + point.lng() + '\tLatitude: ' + point.lat();
		//document.getElementById("coordinatesu").value = v;
		//document.getElementById("coordinatesd").value = v;
	}

	function DrawNAC(flag)
	{
        if(flag) zoom = Math.max(18, map.getBoundsZoomLevel(bs));
		map.setCenter(cp, zoom);
		DrawNACRec();
	}
	
	function DrawNACRec()
	{
        var points = [];
        points.push(new GLatLng(sw.lat(), sw.lng()));
        points.push(new GLatLng(sw.lat(), ne.lng()));
        points.push(new GLatLng(ne.lat(), ne.lng()));
        points.push(new GLatLng(ne.lat(), sw.lng()));
        points.push(new GLatLng(sw.lat(), sw.lng()));
		map.clearOverlays();
        map.addOverlay(new GPolyline(points, "#FF0000", 3, 0.5));
		map.addOverlay(new GMarker(cp));
		showCenterNAC();
	}

	function TrimMid(nac)
	{
        //remove extra blanks in nac
        while(nac.indexOf("  ")>0)
        {
            nac = nac.replace("  ", " ");
        }
		return nac;
	}

	function isNAC(nac)
	{
		if(!nac) return false;
	    var n, m, naclen;
        nac = TrimMid(nac);        
        if(nac.indexOf(' ') == -1) return false;
        if(nac.indexOf('A') != -1) return false;
        if(nac.indexOf('E') != -1) return false;
        if(nac.indexOf('I') != -1) return false;
        if(nac.indexOf('O') != -1) return false;
        if(nac.indexOf('U') != -1) return false;
        if(nac.indexOf('Y') != -1) return false;
                
        //check the length
        naclen = nac.length;
        if(naclen < 3 || naclen > 15 ) {
            alert("NAC: " + nac + " contains too few or too many characters.");
            return false;
        }
        
        //check the space between the two strings
        n = nac.indexOf(' ');
        if( n < 0 ) {
            alert("NAC: " + nac + " does not contain a space between the two strings.");
            return false;
        }
        
        //check whether there are more spaces in the nac
        m = nac.indexOf(' ', n+1);
        if(m>0 && n != m) {
            alert("NAC: " + nac + " has two separated spaces.");
            return false;
        }
        
        //check the positions of hyphens
        var sh = '-';
        if(sh == nac.charAt(0) || sh == nac.charAt(n - 1) || sh == nac.charAt(n + 1) || sh == nac.charAt(naclen-1)) {
            alert("NAC: " + nac + " has hyphens at wrong position.");
            return false;
        }
        
        m = nac.indexOf('-');
        if( m > 0 ) {
            var tem = nac.substr(m + 1);
            var mm = tem.indexOf('-');
            if(m != n - 2 && m != naclen - 2 || mm > 0 && mm != naclen - m - 3) {
                alert("NAC: " + nac + " contains multiple characters after a hyphen in a string.");
                return false;
            }
        }
        
        //Check illegal characters
        var i, j;
        for(i = 0; i<naclen; i++) {
		if(chset.indexOf(nac.charAt(i)) == -1){
                alert("NAC: " + nac + " contains illegal character: " + nac.charAt(i) + ".");
                return false;
            }
        }
		cnac = nac;
        return true;
	}

	function isLatLng(latlng)
	{
		if(!latlng) return false;
		var ch = "0123456789,.-", i;
		for(i=0; i<latlng.length; i++)
		{
			if(ch.indexOf(latlng.charAt(i)) == -1) return false;
		}
		var n = latlng.indexOf(',');
		if(n == -1) return false;
		var lat = latlng.substr(0, n);
		var lng = latlng.substr(n+1);
		var ll = new GLatLng(lat, lng);
		if(!ll) return false;
		cp = ll;
		cnac = toNAC(cp);
		return true;
	}
	
	function getNAC(addr)
	{
		if(isNAC(addr))
		{
			getNACBounds(cnac);
			DrawNAC(true);
		}
		else if(isLatLng(addr))
		{
			getNACBounds(cnac);
			DrawNAC(true);
		}
		else
		{
			var geocoder = new GClientGeocoder();
			geocoder.getLatLng(addr,
				function(point) 
				{
					if (!point) 
					{
						return false; 
					} else {
						cp = point;
						cnac = toNAC(point);
						getNACBounds(cnac);
						DrawNAC(true);
					}
				});
		}
		return true;
	}

    //]]>
