var h_stamp = new Array();
var h_key = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var h_grid = 1000;
var h_size;
var h_x;
var h_y;
var h_lon;
var h_lat;
var min_x_lon = 122930;　　//与那国島
var min_x_lat = 24448;
var min_y_lon = 141470;　　//南硫黄島
var min_y_lat = 24228;

function setHexSize(_level){
    if(_level) {
          level = _level;
          return _level* 0.5;
    }else{
          return 7* 0.5;
    }
}

function getZoneByLocation( _lat, _lon, _level){
    h_size = setHexSize(_level);
    var zone = new Array();
    var lon_grid = _lon*h_grid;
    var lat_grid = _lat*h_grid;
    var unit_x = 6* h_size;
    var unit_y = 2.8* h_size;
    var h_k = (Math.round((1.4/3)* h_grid))/h_grid;
    var base_x = Math.floor((min_x_lon + min_x_lat/h_k)/unit_x);
    var base_y = Math.floor((min_y_lat - h_k*min_y_lon)/unit_y);
    var h_pos_x = (lon_grid + lat_grid/h_k)/unit_x  - base_x;
    var h_pos_y = (lat_grid - h_k*lon_grid)/unit_y  - base_y;
    var h_x_0 = Math.floor(h_pos_x);
    var h_y_0 = Math.floor(h_pos_y);
    var h_x_q = Math.floor((h_pos_x - h_x_0)*100)/100;
    var h_y_q = Math.floor((h_pos_y - h_y_0)*100)/100;
    var h_x = Math.round(h_pos_x);
    var h_y = Math.round(h_pos_y);
    if(h_y_q>-h_x_q+1){
        if((h_y_q<2*h_x_q)&&(h_y_q>0.5*h_x_q)){
            h_x = h_x_0 + 1;
            h_y = h_y_0 + 1;
        }
    }else if(h_y_q<-h_x_q+1){
        if((h_y_q>(2*h_x_q)-1)&&(h_y_q<(0.5*h_x_q)+0.5)){
            h_x = h_x_0;
            h_y = h_y_0;
        }
    }
    var h_x_100 = Math.floor(h_x/3600);
    var h_x_10 = Math.floor((h_x%3600)/60);
    var h_x_1 = Math.floor((h_x%3600)%60);
    var h_y_100 = Math.floor(h_y/3600);
    var h_y_10 = Math.floor((h_y%3600)/60);
    var h_y_1 = Math.floor((h_y%3600)%60);
    if(level){
        if(level<7){
            zone["code"] = "" + h_key.charAt(level%60) + h_key.charAt(h_x_100) + h_key.charAt(h_y_100) + h_key.charAt(h_x_10) + h_key.charAt(h_y_10) + h_key.charAt(h_x_1) + h_key.charAt(h_y_1);
        }else{
            zone["code"] = "" + h_key.charAt(level%60) + h_key.charAt(h_x_10) + h_key.charAt(h_y_10) + h_key.charAt(h_x_1) + h_key.charAt(h_y_1);
        }
    }else{
        zone["code"] = "" + h_key.charAt(h_x_10) + h_key.charAt(h_y_10) + h_key.charAt(h_x_1) + h_key.charAt(h_y_1);
    }
    var h_lat = (h_k*(h_x+base_x)*unit_x + (h_y+base_y)*unit_y)/2;
    var h_lon = (h_lat - (h_y+base_y)*unit_y)/h_k;
    zone["lat"] = h_lat/h_grid;
    zone["lon"] = h_lon/h_grid;
    return zone;
}

function getZoneByCode(_code){
    var c_length = _code.length;
    var zone = new Array();
    level = h_key.indexOf(_code.charAt(0));
    level = (level)?level:60;
    if (c_length !=4){
        h_size =  level* 0.5;
    }else{
        level = 0;
        h_size = 7* 0.5;
    }
    var unit_x = 6* h_size;
    var unit_y = 2.8* h_size;
    var h_k = (Math.round((1.4/3)* h_grid))/h_grid;
    var base_x = Math.floor((min_x_lon + min_x_lat/h_k)/unit_x);
    var base_y = Math.floor((min_y_lat - h_k*min_y_lon)/unit_y);

    if (c_length ==4){
        var h_x = h_key.indexOf(_code.charAt(0))*60+h_key.indexOf(_code.charAt(2));
        var h_y = h_key.indexOf(_code.charAt(1))*60+h_key.indexOf(_code.charAt(3));
    }else 
    if (c_length ==5){
        var h_x = h_key.indexOf(_code.charAt(1))*60+h_key.indexOf(_code.charAt(3));
        var h_y = h_key.indexOf(_code.charAt(2))*60+h_key.indexOf(_code.charAt(4));
    }else{
        var h_x = h_key.indexOf(_code.charAt(1))*3600+h_key.indexOf(_code.charAt(3))*60+h_key.indexOf(_code.charAt(5));
        var h_y = h_key.indexOf(_code.charAt(2))*3600+h_key.indexOf(_code.charAt(4))*60+h_key.indexOf(_code.charAt(6));
    }
    var h_lat = (h_k*(h_x+base_x)*unit_x + (h_y+base_y)*unit_y)/2;
    var h_lon = (h_lat - (h_y+base_y)*unit_y)/h_k;
    zone["code"] = _code;
    zone["lat"] = h_lat/h_grid;
    zone["lon"] = h_lon/h_grid;
    return zone;
}

function drawHex(_zone,_linecolor,_fillcolor,_popinfo){
//   document.getElementById("cnt_zone").innerHTML = _zone.code;
    if(h_stamp[_zone.code] != 1){
        var polygon = new GPolygon([
        new GLatLng(_zone.lat,(_zone.lon - 2* h_size/h_grid)),
        new GLatLng((_zone.lat + 1.4* h_size/h_grid),(_zone.lon - 1* h_size/h_grid)),
        new GLatLng((_zone.lat + 1.4* h_size/h_grid),(_zone.lon + 1* h_size/h_grid)),
        new GLatLng(_zone.lat,(_zone.lon + 2* h_size/h_grid)),
        new GLatLng((_zone.lat - 1.4* h_size/h_grid),(_zone.lon + 1* h_size/h_grid)),
        new GLatLng((_zone.lat - 1.4* h_size/h_grid),(_zone.lon - 1* h_size/h_grid)),
        new GLatLng(_zone.lat,(_zone.lon - 2* h_size/h_grid))
		  ], _linecolor, 1, 1, _fillcolor, 0.1);
        map.addOverlay(polygon);
        if(_popinfo){
            var myHtml = "<br />[ZONE] <a href='./?code="+_zone.code+"'>"+_zone.code+"</a>";
            var point = new GLatLng(_zone.lat,_zone.lon);
            map.openInfoWindowHtml(point, myHtml);

            GEvent.addListener(polygon,"click",function(){
            map.openInfoWindowHtml(point, myHtml);
            });
        }
        h_stamp[_zone.code] = 1
    }
}