//------------------------------------------------------------
//------------------------------------------------------------
/**
 * @package     shokunin-san.com/kanamaga/map/
 * @author      Digital Alliance Inc.
 * @access      public
 */
//------------------------------------------------------------
//------------------------------------------------------------
var map, daPointList, handle, searchMarker;
var dispCtLimit = 100;
var prefm       = getPrefMaster();
var datafile    = "./shopData/json/kanamaga.json";
//------------------------------------------------------------
//------------------------------------------------------------
window.onresize=function(e){
    setDisplaySize();
}
window.onload = function(){
    setDisplaySize();
    clearFormValue();
    makeMap();
    var rand = (new Date()).getTime();
    requestFileGhttp(datafile+"?"+rand,"get",function(o){prepare(o);},{});
    setMoveEvent();
    //setAddressInfo();
}
//------------------------------------------------------------
function clearFormValue(){
    document.getElementById('address').value = "";
    document.getElementById('shop').value    = "";
    document.getElementById('pref_cd').value = "";
}
//------------------------------------------------------------
function makeMap(){
    //if(!GBrowserIsCompatible()){
    //    return false;
    //}
    map = new GMap2(document.getElementById("map"));
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    map.enableScrollWheelZoom();
    //map.setCenter(new GLatLng(36.3, 136), 6);

    map.setCenter(new GLatLng(38.5, 137.5), 6);

    //map.addControl(new GSmallZoomControl());
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    //map.addControl(new GOverviewMapControl());
    return true;
}
//------------------------------------------------------------
/*
function setAddressInfo(){
    var zoom = map.getZoom();
    GEvent.addListener(map, 'click', function(overlay, point) {
      if(point){
        document.getElementById("result4").innerHTML = "zoom: " +zoom+" ,lat: "+point.x+"         ,lng: "+point.y;
      }
    });
}
*/
//------------------------------------------------------------
function requestFileGhttp(fileName,method,func,arg){
    var httpObj = GXmlHttp.create();
    //var httpObj = createHttpRequest();
    httpObj.open(method, fileName);
    httpObj.onreadystatechange = function() {
        if((httpObj.readyState==4) && (httpObj.status==200)){
            func(httpObj);
        }
    };
    httpObj.send(null);
}
//------------------------------------------------------------
function setSearchResult(obj){
    if(obj){
        document.getElementById('areaDisplay').innerHTML = obj.responseText;
    }
}
//------------------------------------------------------------
function prepare(obj){
    makePointList(obj);
    setMarkerList("onload");
    var res = tryFunction(function(arg){
        checkRequest(arg);
    },getRequest());
}
//------------------------------------------------------------
function setMarkerList(eventName){
    //
    var zoomLevel=map.getZoom();
    if(zoomLevel<=4){
        return false;
    }
    daPointList.display();
    /*
    //----------------------------------------------------------------------
    //検証
    //----------------------------------------------------------------------
    document.getElementById("result1").innerHTML = "disp:"+daPointList.dispCt;
    document.getElementById("result2").innerHTML = "area:"+daPointList.areaCt;
    document.getElementById("result3").innerHTML = "all:"+daPointList.list.length;
    //----------------------------------------------------------------------
    */
}
//------------------------------------------------------------
/*
function __makePointList(obj){
    var json = eval("("+obj.responseText+")");
    daPointList = new daPointList(dispCtLimit);
    for(var i=0;i<json['ROW'].length;i++){
        daPointList.list[i] = new daPoint(new GLatLng(json['ROW'][i]['lat'],json['ROW'][i]['lng']),json['ROW'][i],(json['ROW'][i]['reco']==1)? true:false);
        makeMarker(daPointList.list[i]);
    }
    daPointList.list=shuffle(daPointList.list);
}
*/
function makePointList(obj){
    //
    daPointList = new daPointList(dispCtLimit);

    if(!obj.responseText){
        return null;
    }
    var json = eval("("+obj.responseText+")");
    //

    var j=0, k=0, temp=[];
    for(var i=0;i<json['ROW'].length;i++){
        if(json['ROW'][i]['reco']==1){
            daPointList.list[j] = makePoint(json['ROW'][i]);
            makeMarker(daPointList.list[j]);
            j++;
        }else{
            temp[k] = makePoint(json['ROW'][i]);
            makeMarker(temp[k]);
            k++;
        }
    }
    if(temp.length>0){
        shuffle(temp);
        for(var i=0;i<temp.length;i++){
            daPointList.addList(temp[i]);
        }
    }
}
//------------------------------------------------------------
function makePoint(data){
    var recoFlag=0;
    if(data['reco']==1){
        recoFlag=1;
    }
    return new daPoint(new GLatLng(data['lat'],data['lng']),data,recoFlag);
}
//------------------------------------------------------------
function removeMarker(obj) { 
    map.removeOverlay(obj.marker);
} 
//------------------------------------------------------------
function addMarker(obj){
    if(!obj){
        return null;
    }
    if(!obj.marker){
        makeMarker(obj);
    }
    map.addOverlay(obj.marker);
}
//------------------------------------------------------------
function makeMarker(obj){
    //if(!obj){
    //    return null;
    //}
    var icon01 = makeIcon("greenWD");
    var icon02 = makeIcon("redWD");

    if(obj.recoFlag){
        obj.marker = new GMarker(obj.point,{icon: icon01});
    }else{
        obj.marker = new GMarker(obj.point,{icon: icon02});
    }

    GEvent.addListener(obj.marker, "click", function(){
        obj.marker.openInfoWindowHtml(obj.getHtml());
        GEvent.addListener(obj.marker, "infowindowopen", function() {
            onOpenFn();
        });
        GEvent.addListener(obj.marker, "infowindowclose", function() {
            onCloseFn();
        });
    });
    return obj;
}
//------------------------------------------------------------
function onOpenFn(){
    dellMoveEvent();
}
//------------------------------------------------------------
function onCloseFn(){
    dellMoveEvent();//2重登録防止
    setMoveEvent();
}
//------------------------------------------------------------
function setMoveEvent(){
    handle = GEvent.addListener(map, "moveend", function(){setMarkerList("moveend2");});
}
//------------------------------------------------------------
function dellMoveEvent(){
    GEvent.removeListener(handle);
}
//------------------------------------------------------------
function checkRequest(request){
    if(request["address"]){
        showAddress(request["address"]);
    }
    if(request["id"]){
        detail(request["id"]);
    }
    if(request["pref_cd"]){
        document.getElementById('pref_cd').value=request["pref_cd"];
        showPrefList(request["pref_cd"]);
    }
}
//------------------------------------------------------------
function showAddress(address){
    if(!address.length){
        alert("住所を入力してください");
        return false;
    }
    var geo = new GClientGeocoder();
    if(geo){
        geo.getLatLng(address,function(point){
            if(!point){
                alert("「"+address+"」は見つかりませんでした");
            }else{
                if(searchMarker){
                    map.removeOverlay(searchMarker);
                }
                map.setCenter(point, 13);
                searchMarker = new GMarker(point, makeIcon("pinkND"));
                map.addOverlay(searchMarker);
                searchMarker.openInfoWindowHtml(address +"<br>(lat=" + point.lat() +", lng=" + point.lng() + ")");
            }
        });
    }
}
//------------------------------------------------------------
function detail(id){
    if(!id){
        return null;
    }
    map.closeInfoWindow();
    var result;
    for(var i=0;i<daPointList.list.length;i++){
        if(daPointList.list[i].dataObj.id==id){
            result=daPointList.list[i];
            if(result.marker){
                map.setCenter(result.point, 13);
                GEvent.trigger(result.marker,"click");
            }else{
                result.dispFlag=true;
                addMarker(result);
                map.setCenter(result.point, 13);
                GEvent.trigger(result.marker,"click");
            }
            break;
        }
    }
}
//------------------------------------------------------------
function searchShop(shop){
    if(!shop.length){
        alert("店舗名を入力してください");
        return false;
    }
    map.closeInfoWindow();
    //
    shop=han2Zen(shop);
    document.getElementById('shop').value = shop;
    document.getElementById('areaDisplay').innerHTML = '<img src="img/loading.gif" width="32" height="32" />';
    var rand = (new Date()).getTime();
    requestFileGhttp('php/search.php?shop='+encodeURI(shop)+'&'+rand,"get",function(o){setSearchResult(o);},{});
    return false;
}
//------------------------------------------------------------
function showPrefList(pref_cd){
    if(!prefm[pref_cd]){
        return null;
    }
    map.closeInfoWindow();
    var prefObj=prefm[pref_cd];
    map.setCenter(new GLatLng(prefObj.lng,prefObj.lat),prefObj.zoom);
    //
    document.getElementById('areaDisplay').innerHTML = '<img src="img/loading.gif" width="32" height="32" />';
    var rand = (new Date()).getTime();
    requestFileGhttp('php/search.php?pref='+encodeURI(prefObj.name)+'&'+rand,"get",function(o){setSearchResult(o);},{});
    return false;
}
//------------------------------------------------------------
//------------------------------------------------------------
function daPoint(point, dataObj,reco){
    this.point    = point;
    this.dataObj  = dataObj;
    this.marker   = null;
    this.dispFlag = false;
    this.areaFlag = false;
    this.recoFlag = reco;
}
daPoint.prototype ={
    getHtml: function(){
        var item=this.dataObj;
        //
        item.img_shop  = '/sys_img/member/' + item.sid + '/1_s.jpg';
        item.img_error = 'onError="this.src=\'./img/default.jpg\'"';

        //item.url2 = 'http://www.shokunin-san.com/';
        item.url2 = "http://www.shokunin-san.com/index.php?action=public_hpservice_index";
        if(item.url.length>0){
            item.url2 = item.url;
        }
        //
        var html= document.getElementById("balloon").innerHTML;
        for(var k in item){
            if(!item[k].length){
                item[k]="";
            }
            html=html.replaceAll("###"+k+"###", item[k]);
        }
        return html;
    }
};
//------------------------------------------------------------
//------------------------------------------------------------
function daPointList(dispCtLimit){
    this.list = [];
    this.areaCt=0;
    this.dispCt=0;
    this.dispCtLimit=dispCtLimit;
}
daPointList.prototype ={
    getList: function(){
        return this.list;
    },
    addList: function(point){
        this.list.push(point);
        return point;
    },
    display: function(){
        this.areaCt=0;
        this.dispCt=0;
        var area = map.getBounds();
        var data = this.list;

        for(var i=0;i<data.length;i++){
            if(area.contains(data[i].point)){
                this.areaCt++;
                data[i].areaFlag=true;
                if(this.dispCt<this.dispCtLimit){
                    if(!data[i].dispFlag){
                        addMarker(data[i]);
                        data[i].dispFlag=true;
                    }
                    this.dispCt++;
                }else{
                    if(data[i].marker){
                        removeMarker(data[i]);
                    }
                    data[i].dispFlag=false;
                }
            }else{
                if(data[i].marker){
                    removeMarker(data[i]);
                }
                data[i].areaFlag=false;
                data[i].dispFlag=false;
            }
        }
        //----------------------------------------------------------------------
        //検証
        //----------------------------------------------------------------------
        /*
        var res="";
        for(var i=0;i<this.list.length;i++){
            if(this.list[i].marker){
                res += i+':'+this.list[i].dispFlag+':'+this.list[i].dataObj.shop+'OK\n';
            }else{
                res += i+':'+this.list[i].dispFlag+':'+this.list[i].dataObj.shop+'\n';
            }
        }
        alert(res);
        */
        //----------------------------------------------------------------------
    }
};
//------------------------------------------------------------
function getRequest() {
    var data   = [];
    var query  = window.location.search.substring(1); 
    var params = query.split('&');
    for (var i=0; i<params.length; i++) { 
        var pos = params[i].indexOf('='); 
        if (pos > 0) { 
            var key = params[i].substring(0,pos); 
            var val = params[i].substring(pos+1); 
            data[key] = val;
        } 
    }
    return data;
}
//------------------------------------------------------------
function tryFunction(func,arg){
    try{
       func(arg);
    }catch(e){
        return e;
    }finally{
        //return;
    }
}
//------------------------------------------------------------
function shuffle(list){ 
    var i = list.length;
    while(--i){
        var j = Math.floor(Math.random()*(i+1));
        if(i==j)continue;
        var k=list[i];
        list[i]=list[j];
        list[j]=k;
    }
    return list;
}
//------------------------------------------------------------
function makeIcon(type) {
    if( type=="redWD"||type=="blueWD"||type=="greenWD"||type=="yellowWD"||type=="purpleWD"||
        type=="orangeWD"||type=="pinkWD"||type=="ltblueWD"||type=="redND"||type=="blueND" ||
        type=="greenND"||type=="yellowND"||type=="purpleND"||type=="orangeND"||type=="pinkND"){

        type = type.replace("WD","-dot"); 
        type = type.replace("ND","");

        var largeIcon        = new GIcon(G_DEFAULT_ICON);
        largeIcon.image      = "img/marker_icon/"+type+".png"; 
        largeIcon.shadow     = "img/marker_icon/marker_shadow.png"; 
        largeIcon.iconSize   = new GSize(32, 32);
        largeIcon.shadowSize = new GSize(59, 32);
        largeIcon.iconAnchor = new GPoint(15, 34);

        return largeIcon;
    }
    else if(type == "red"||type=="blue"||type=="green"||type=="yellow"||
            type == "purple"||type=="orange"||type=="white"||type=="gray"||type=="black"){

        var miniIcon   = new GIcon(baseIcon);
        miniIcon.image = "./mm_20_"+type+".png";
        return miniIcon;
    }
}
//------------------------------------------------------------
function getPrefMaster(){
    var pref=[];
    pref['01'] = {name:"北海道"  ,zoom: 7 ,lat:141.347029         ,lng:43.064342 }
    pref['02'] = {name:"青森県"  ,zoom: 8 ,lat:140.7401955127716  ,lng:40.82456733960833 }
    pref['03'] = {name:"岩手県"  ,zoom: 8 ,lat:141.15232229232788 ,lng:39.70376120246107 }
    pref['04'] = {name:"宮城県"  ,zoom: 8 ,lat:140.87172031402588 ,lng:38.26902447956324 }
    pref['05'] = {name:"秋田県"  ,zoom: 8 ,lat:140.1031494140625  ,lng:39.71829551446785 }
    pref['06'] = {name:"山形県"  ,zoom: 8 ,lat:140.36293745040894 ,lng:38.240548042015625 }
    pref['07'] = {name:"福島県"  ,zoom: 8 ,lat:140.46723246574402 ,lng:37.75031559316077 }
    pref['08'] = {name:"茨城県"  ,zoom: 8 ,lat:140.44676184654236 ,lng:36.342239780397186 }
    pref['09'] = {name:"栃木県"  ,zoom: 8 ,lat:139.883476         ,lng:36.563031 }
    pref['10'] = {name:"群馬県"  ,zoom: 8 ,lat:139.06043529510498 ,lng:36.39097397142163 }
    pref['11'] = {name:"埼玉県"  ,zoom: 8 ,lat:139.6486759185791  ,lng:35.8575787663375 }
    pref['12'] = {name:"千葉県"  ,zoom: 8 ,lat:139.6486759185791  ,lng:35.8575787663375 } 
    pref['13'] = {name:"東京都"  ,zoom: 8 ,lat:139.69170928001404 ,lng:35.68953530693469 }
    pref['14'] = {name:"神奈川県",zoom: 8 ,lat:139.64253902435303 ,lng:35.448207476677204 }
    pref['15'] = {name:"新潟県"  ,zoom: 8 ,lat:139.02318477630615 ,lng:37.90279528203268 }
    pref['16'] = {name:"富山県"  ,zoom: 8 ,lat:137.21134185791016 ,lng:36.6955133462719 }
    pref['17'] = {name:"石川県"  ,zoom: 8 ,lat:136.6255795955658  ,lng:36.59489156544999 }
    pref['18'] = {name:"福井県"  ,zoom: 8 ,lat:136.22163891792297 ,lng:36.065318422112156 }
    pref['19'] = {name:"山梨県"  ,zoom: 8 ,lat:138.568443         ,lng:35.664416 }
    pref['20'] = {name:"長野県"  ,zoom: 8 ,lat:138.18076729774475 ,lng:36.65124012012736 }
    pref['21'] = {name:"岐阜県"  ,zoom: 8 ,lat:136.7226541042328  ,lng:35.39125406994091 }
    pref['22'] = {name:"静岡県"  ,zoom: 8 ,lat:138.38269472122192 ,lng:34.977117978410206 }
    pref['23'] = {name:"愛知県"  ,zoom: 8 ,lat:136.90685749053955 ,lng:35.180552045115476 }
    pref['24'] = {name:"三重県"  ,zoom: 8 ,lat:136.50864601135254 ,lng:34.73052977910718 }
    pref['25'] = {name:"滋賀県"  ,zoom: 8 ,lat:135.8686065673828  ,lng:35.004637988872645 }
    pref['26'] = {name:"京都府"  ,zoom: 8 ,lat:135.755332         ,lng:35.021197 }
    pref['27'] = {name:"大阪府"  ,zoom: 8 ,lat:135.5198872089386  ,lng:34.68651927950252 }
    pref['28'] = {name:"兵庫県"  ,zoom: 8 ,lat:135.18336653709412 ,lng:34.691618287838764 }
    pref['29'] = {name:"奈良県"  ,zoom: 8 ,lat:135.83280444145203 ,lng:34.685540022228416 }
    pref['30'] = {name:"和歌山県",zoom: 8 ,lat:135.1676058769226  ,lng:34.22619191215841 }
    pref['31'] = {name:"鳥取県"  ,zoom: 8 ,lat:134.237736         ,lng:35.503891 }
    pref['32'] = {name:"島根県"  ,zoom: 8 ,lat:133.05058121681213 ,lng:35.47260624820258 }
    pref['33'] = {name:"岡山県"  ,zoom: 8 ,lat:133.93463730812073 ,lng:34.66177845658871 }
    pref['34'] = {name:"広島県"  ,zoom: 8 ,lat:132.45959401130676 ,lng:34.39675605290727 }
    pref['35'] = {name:"山口県"  ,zoom: 8 ,lat:131.4705991744995  ,lng:34.18633461055774 }
    pref['36'] = {name:"徳島県"  ,zoom: 8 ,lat:134.55911993980408 ,lng:34.065894243734085 }
    pref['37'] = {name:"香川県"  ,zoom: 8 ,lat:134.0434169769287  ,lng:34.34024695246838 }
    pref['38'] = {name:"愛媛県"  ,zoom: 8 ,lat:132.7658486366272  ,lng:33.841744297429244 }
    pref['39'] = {name:"高知県"  ,zoom: 8 ,lat:133.53102922439575 ,lng:33.55991227848525 }
    pref['40'] = {name:"福岡県"  ,zoom: 8 ,lat:130.41810035705566 ,lng:33.606595504206076 }
    pref['41'] = {name:"佐賀県"  ,zoom: 8 ,lat:130.29922485351562 ,lng:33.24958072437287 }
    pref['42'] = {name:"長崎県"  ,zoom: 8 ,lat:129.87349390983582 ,lng:32.74490844107667 }
    pref['43'] = {name:"熊本県"  ,zoom: 8 ,lat:130.7417893409729  ,lng:32.79009761441642 }
    pref['44'] = {name:"大分県"  ,zoom: 8 ,lat:131.6125738620758  ,lng:33.23831961172808 }
    pref['45'] = {name:"宮崎県"  ,zoom: 8 ,lat:131.42391800880432 ,lng:31.9113339168641 }
    pref['46'] = {name:"鹿児島県",zoom: 8 ,lat:130.557983         ,lng:31.560169 }
    pref['47'] = {name:"沖縄県"  ,zoom: 8 ,lat:127.6806914806366  ,lng:26.21247343163079 }
    return pref;
}
function han2Zen(str){
    var hanList = new Array("ｶﾞ","ｷﾞ","ｸﾞ","ｹﾞ","ｺﾞ","ｻﾞ","ｼﾞ","ｽﾞ","ｾﾞ","ｿﾞ","ﾀﾞ","ﾁﾞ",
        "ﾂﾞ","ﾃﾞ","ﾄﾞ","ﾊﾞ","ﾋﾞ","ﾌﾞ","ﾍﾞ","ﾎﾞ","ﾊﾟ","ﾋﾟ","ﾌﾟ","ﾍﾟ","ﾎﾟ","ｦ","ｧ",
        "ｨ","ｩ","ｪ","ｫ","ｬ","ｭ","ｮ","ｯ","ｰ","ｱ","ｲ","ｳ","ｴ","ｵ","ｶ","ｷ","ｸ","ｹ",
        "ｺ","ｻ","ｼ","ｽ","ｾ","ｿ","ﾀ","ﾁ","ﾂ","ﾃ","ﾄ","ﾅ","ﾆ","ﾇ","ﾈ","ﾉ","ﾊ","ﾋ",
        "ﾌ","ﾍ","ﾎ","ﾏ","ﾐ","ﾑ","ﾒ","ﾓ","ﾔ","ﾕ","ﾖ","ﾗ","ﾘ","ﾙ","ﾚ","ﾛ","ﾜ","ﾝ");
    var zenList = new Array("ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ",
        "ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ","ヲ","ァ",
        "ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","ー","ア","イ","ウ","エ","オ","カ",
        "キ","ク","ケ","コ","サ","シ","ス","セ","ソ","タ","チ","ツ","テ","ト","ナ",
        "ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ","ミ","ム","メ","モ","ヤ",
        "ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン");
    while(str.match(/[ｦ-ﾝ]/)){
        for(var i=0; i<hanList.length;i++){
            str=str.replace(hanList[i],zenList[i]);
        }
    }
    return str;
}


//------------------------------------------------------------
//------------------------------------------------------------
function setDisplaySize(){
    resizer("map",300,34);
    resizer("areaDisplay",false,333);
}
function resizer(elementId,diff_W,diff_H){
    var  elem=document.getElementById(elementId);
    var diff={};
    diff['w']=diff_W;
    diff['h']=diff_H;
    resizer.init(diff,elem);
    /*
    window.onresize=function(e){
        resizer.init(diff,elem);
        alert(elem.id)
    }
    */
}
resizer.init=function(diff,elem){
    var size=resizer.getWindowSize();
    var w=size['w'],h=size['h'];
    if(diff['w']!==false && diff['w']<w){
        elem.style.width=w-diff['w']+"px";
    }
    if(diff['h']!==false && diff['h']<h){
        elem.style.height=h-diff['h']+"px";
    }
}
resizer.getWindowSize=function(){
    var s={};
    if(document.all){
        s['w']=document.documentElement.clientWidth
        s['h']=document.documentElement.clientHeight;
    }else{
        s['w']=window.innerWidth;
        s['h']=window.innerHeight;
    }
    return s;
}
//------------------------------------------------------------
//------------------------------------------------------------
String.prototype.replaceAll = function(org, dest){
    return this.split(org).join(dest);   
}
//------------------------------------------------------------
//------------------------------------------------------------

