/* マップを表示する */
var MapViewer = Class.create();
MapViewer.prototype = {
    initialize: function(mapid) {
        this.userlay = null;
        this.mapdiv = document.getElementById(mapid);
        this.usrctl = null;
        this.zomctl = null;
        /* フリースクロール地図を取得する */
        this.map = new ZdcMap(document.getElementById(mapid));
        /* 見栄えの良い地図で再生成 */
        this.map.setMapType('4');
        this.map.reflashMap();
        this.map.setWheelOff();
        ZdcEvent.addListener(this.map, 'dragmapend', function() {
            if($('mapaddrsname')) {
                surroundingshoplist();
                this.execdecodeaddr();
            }
        }.bind(this));
    },
    visibilitymap: function() {
        this.mapdiv.style.visibility = 'visible';
    },
    locationcenterwgs: function(wgslat, wgslon) {
        var zpoint = ZdcCommon.WGS2TKY(wgslon, wgslat);
        this.map.setMapLocation(zpoint, this.map.getMapScale());
    },
    getlocationcenterwgs: function() {
        var zpointtky = this.map.getMapLocation();
        var zpointwgs = ZdcCommon.TKY2WGS(zpointtky.lon, zpointtky.lat);
        return zpointwgs;
    },
    getlocationboxwgs: function() {
        var centerpoint = this.map.getMapLocation();
        var box = this.map.getMapBoundBox(centerpoint, this.map.getMapScale());
        var np1 = box.p1;
        var np2 = box.p2;
        var wgszpoint1 = ZdcCommon.TKY2WGS(np1.lon, np1.lat);
        var wgszpoint2 = ZdcCommon.TKY2WGS(np2.lon, np2.lat);
        var wgscenterzpoint = ZdcCommon.TKY2WGS(centerpoint.lon, centerpoint.lat);
        var parameter = "?p1lat=" + wgszpoint1.lat + "&p1lon=" + wgszpoint1.lon
        + "&p2lat=" + wgszpoint2.lat + "&p2lon=" + wgszpoint2.lon
        + "&centerlat=" + wgscenterzpoint.lat + "&centerlon=" + wgscenterzpoint.lon
        + "&zoomlevel=" + this.map.getMapScale();
        return parameter;
    },
    getlocationwgsparam: function() {
        var centerpoint = this.map.getMapLocation();
        var box = this.map.getMapBoundBox(centerpoint, this.map.getMapScale());
        var np1 = box.p1;
        var np2 = box.p2;
        var wgszpoint1 = ZdcCommon.TKY2WGS(np1.lon, np1.lat);
        var wgszpoint2 = ZdcCommon.TKY2WGS(np2.lon, np2.lat);
        var wgscenterzpoint = ZdcCommon.TKY2WGS(centerpoint.lon, centerpoint.lat);
        var parameter = "centerlat=" + wgscenterzpoint.lat + "&centerlon=" + wgscenterzpoint.lon
        + "&zoomlevel=" + this.map.getMapScale();
        return parameter;
    },
    locationcentertky: function(tkylat, tkylon) {
        var zpoint = new ZdcPoint(tkylon, tkylat);
        this.map.setMapLocation(zpoint, this.map.getMapScale());
    },
    locationcenterlocalname: function(localname) {
        _viewer = this;
        _viewer.map.visibleZdcWait();
        /* 検索オブジェクトと検索条件指定オブジェクトを生成する */
        var addr = new ZdcSearchAddress();
        var opts = new ZdcSearchAddressOptions(localname);
        /* 検索条件を指定する */
        opts.pointFlg = '1'; // 緯度経度を標準形式で取得する
        /* 検索終了後に実施する関数をイベントリスナ登録する */
        ZdcEvent.addListener(addr, 'end', function(result) {
            if(result.status == '1') {
                alert('住所取得エラー');
            } else if(result.status == '0') {
                var zpoint = new ZdcPoint(result.items[0].lon, result.items[0].lat);
                _viewer.map.setMapLocation(zpoint, _viewer.map.getMapScale());
            }
        });
        /* 検索を実施する */
        addr.search(opts);
    },
    setzoomlevel: function(zoomlevel) {
        this.map.setMapScale(zoomlevel);
    },
    getzoomlevel: function() {
        return this.map.getMapScale();
    },
    writeformpreset: function() {
        viewer = this;
        /* ユーザレイヤを作成する */
        viewer.userlay = new ZdcUserLayer();
        viewer.userlay.setLayerScale(1,18); // 縮尺レベル1から18に対応
        viewer.userlay.setLayerType('manual');
        var icon 	= new ZdcIcon();
        icon.image = "http://img.lococom.jp/img2/lo/map/icon_kuchikomi.png";
        var marker	= new ZdcMarker(viewer.map.getMapLocation(), icon);
        viewer.userlay.addMarker(marker);

        /* 【地図マウスクリック移動】でウィンドウステータスに緯度経度を表示する */
        ZdcEvent.addListener(viewer.map, 'dblclickend', function() {
            viewer.userlay.clearMarker('manual') ;
            var zpointadd = new ZdcPoint(viewer.map.MouseLon, viewer.map.MouseLat);
            var iconadd 	= new ZdcIcon();
            iconadd.image = "http://img.lococom.jp/img2/lo/map/icon_kuchikomi.png";
            var markeradd	= new ZdcMarker(zpointadd, iconadd);
            viewer.userlay.addMarker(markeradd);

            if($('shoplist')) {
                surroundingshoplist();
                this.execdecodeaddr();
            }
        });
        /* 地図にユーザレイヤを追加する */
        viewer.map.addUserLayer(viewer.userlay);
    },
    confirmformpreset: function() {
        viewer = this;
        /* ユーザレイヤを作成する */
        viewer.userlay = new ZdcUserLayer();
        viewer.userlay.setLayerScale(1,18); // 縮尺レベル1から18に対応
        viewer.userlay.setLayerType('manual');

        var icon 	= new ZdcIcon();
        icon.image = "http://img.lococom.jp/img2/lo/map/icon_kuchikomi.png";
        var marker	= new ZdcMarker(viewer.map.getMapLocation(), icon);
        viewer.userlay.addMarker(marker);
        /* 地図にユーザレイヤを追加する */
        viewer.map.addUserLayer(viewer.userlay);
        viewer.map.dragOff();
    },
    movemarker: function(lat, lon) {
        this.userlay.clearMarker('manual');
        var zpointadd = new ZdcPoint(lon, lat);
        var iconadd 	= new ZdcIcon();
        iconadd.image = "http://img.lococom.jp/img2/lo/map/icon_kuchikomi.png";
        var markeradd	= new ZdcMarker(zpointadd, iconadd);
        this.userlay.addMarker(markeradd);
    },
    getmarkerlocation: function(lat, lon) {
        getMarker = this.userlay.getMarkerById(0);
        return getMarker.getPoint();
    },
    getmarkerlocationwgs: function(lat, lon) {
        getMarker = this.userlay.getMarkerById(0);
        var zpointwgs = ZdcCommon.TKY2WGS(getMarker.getPoint().lon, getMarker.getPoint().lat);
        return zpointwgs;
    },
    resizemapwindow: function(x, y, w, h) {
        this.map.resizeMapWindow(x, y, w, h);
    },
    redrawusercontrol: function() {
        this.map.removeUserControl();
        this.map.removeUserZoomControl();
        var wsize = this.map.getMapWindowSize();
        var mapw  = wsize.width;
        var USRCTL_left = 10;
        var ZOMCTL_left = 75;
        // 地図にユーザコントロール、ユーザズームコントロールを追加する
        this.map.addUserControl(this.usrctl, 10, USRCTL_left);
        this.map.addUserZoomControl(this.zomctl, 31, ZOMCTL_left);
    },
    mousecontroltown: function() {
        /* 【地図マウス移動】でウィンドウステータスに緯度経度を表示する */
        ZdcEvent.addListener(this.map, 'dragmapend', function() {
            var zpoint = ZdcCommon.TKY2WGS(this.map.MouseLon, this.map.MouseLat);
        });
    },
    customizecontoller: function() {
        viewer = this;

        //-------------------------------------------------------------------------
        // ズーム変更時、ターゲットを中心にする(マウスホイール)
        //-------------------------------------------------------------------------
        viewer.map.CenterFirst = false;
        //-------------------------------------------------------------------------
        // コントロールのカスタマイズ(ユーザコントロール)
        //-------------------------------------------------------------------------
        viewer.usrctl = new ZdcUserControl();
        // 画像をユーザコントロールに追加する
        viewer.usrctl.setImage('http://img.lococom.jp/img2/lo/map/control.png', // コントロール画像URI
                        new ZdcSize(60,60), // コントロールサイズ
                        'http://img.lococom.jp/img2/lo/map/shadow.png', // コントロール影部分画像URI
                        new ZdcSize(62,62) // コントロール影部分サイズ
                        );
        viewer.usrctl.setDocPosition(0,0,0,0);   // (img position shd position)
        // アクションボタンを生成する
        viewer.usrctl.setAction(1,20,0,39,19);    // (actionid,pixel area)
        viewer.usrctl.setAction(2,0,20,19,39);
        viewer.usrctl.setAction(3,40,20,59,39);
        viewer.usrctl.setAction(4,20,40,39,59);
        viewer.usrctl.setAction(5,20,20,39,39);
        // イベントリスナを追加する
        ZdcEvent.addListener(viewer.usrctl, 'clickend', function(){
            viewer.map.closeZdcMsgHtml();
            switch(this.actionid){
                case 'none':
                    break;
                case 1:
                    viewer.map.scrollMap(0,300);
                    break;
                case 2:
                    viewer.map.scrollMap(300,0);
                    break;
                case 3:
                    viewer.map.scrollMap(-300,0);
                    break;
                case 4:
                    viewer.map.scrollMap(0,-300);
                    break;
                case 5:
                    viewer.map.restoreMapLocation();
                    break;
            }
        });
        //-------------------------------------------------------------------------
        // コントロールのカスタマイズ(ユーザズームコントロール)
        //-------------------------------------------------------------------------
        viewer.zomctl = new ZdcUserZoomControl();
        viewer.zomctl.setImage('http://img.lococom.jp/img2/lo/map/zoomcontrol.png', // ズームコントロール画像URI
                        new ZdcSize(154,34), // ズームコントロールサイズ
                        'http://img.lococom.jp/img2/lo/map/grid.png', // グリッド部画像URI
                        new ZdcSize(8,19), // グリッド部サイズ
                        null, // ズームコントロール影画像URI
                        null // ズームコントロール影サイズ
                        );
        viewer.zomctl.setDocPosition(-11,0,0,0); //(basedoc shadowdoc griddoc)
        viewer.zomctl.setDragType(2);
        // アクションボタンを生成する
        viewer.zomctl.setAction('zoomIn',0,11,19,34);      // (action id,pixel area)
        viewer.zomctl.setAction('zoomOut',136,11,154,34);
        viewer.zomctl.setAction('slither',22,0,138,19,8);
        viewer.zomctl.setAction('setZoom',22,0,138,19);

        // イベントリストナを追加する
        ZdcEvent.addListener(viewer.zomctl,'clickend',function(){
            switch(this.actionid){
                case 'none':
                    break;
                case 'zoomIn':
                    viewer.map.mapZoomIn();
                    viewer.setSlitherPosition();
                    break;
                case 'zoomOut':
                    viewer.map.mapZoomOut();
                    this.setSlitherPosition();
                    break;
                case 'setZoom':
                    var s = this.getZoom();
                    viewer.map.setMapScale(s);
                    this.setSlitherPosition();
                    break;
            }
        });
        ZdcEvent.addListener(viewer.zomctl,'mousedowngrid',function(){
            if(this.actionid=='slither'){
                this.dragstart();
                return false;
            }
        });
        ZdcEvent.addListener(viewer.zomctl,'mouseup',function(){
            if(this.actionid=='slither'){
                this.dragend();
            }
        });
        //-------------------------------------------------------------------------
        // ユーザコントロール、ユーザズームコントロールを地図に追加する
        //-------------------------------------------------------------------------
        // 表示位置を算出する
        var wsize = viewer.map.getMapWindowSize();
        var mapw  = wsize.width;
        var USRCTL_left = 10;
        var ZOMCTL_left = 75;
        // 地図にユーザコントロール、ユーザズームコントロールを追加する
        viewer.map.addUserControl(viewer.usrctl, 10, USRCTL_left);
        viewer.map.addUserZoomControl(viewer.zomctl, 31, ZOMCTL_left);

        // ユーザズームコントロールのスライサーの初期位置を地図縮尺にあわせる
        viewer.zomctl.setSlitherPosition();
    },
    //-----------------------------------------------------------------------------
    // 住所逆引きする
    //-----------------------------------------------------------------------------
    execdecodeaddr: function() {
        _setter = this;
        var addr = new ZdcGetAddressStringGik();
        var opts = new ZdcGetAddressStringGikOptions(this.map.getMapLocation());
        opts.matchLevel = 3; // 街区までの住所文字列を取得する
        ZdcEvent.addListener(addr, 'end', _setter.decodeaddrresult);
        addr.search(opts);
    },
    //-----------------------------------------------------------------------------
    // 逆引き結果を表示する
    //-----------------------------------------------------------------------------
    decodeaddrresult: function(result) {
        if(result.status == 1) {
            msg = 'パラメータエラーが発生しました';
        } else if(result.status == 2) {
            msg = 'サーバエラーが発生しました';
        } else if(result.status == 3) {
            msg = 'タイムアウトにより処理を終了しました';
        } else if(result.status == 4) {
            msg = '検索が中止されました';
        } else if(result.status == 5) {
            msg = '該当データが存在しませんでした';
        } else if(result.status == 6) {
            msg = '認証エラーが発生しました';
        } else if(result.status == 9) {
            msg = 'その他のエラーが発生しました';
        } else if(result.status == 0) {
            msg = '検索に成功しました';
        }
        var txtdiv = document.getElementById('mapaddrsname');
        td01Text = document.createTextNode("「"+result.items[0].address+"」");
        if (txtdiv.firstChild != null) txtdiv.removeChild(txtdiv.firstChild);
        txtdiv.appendChild(td01Text);
        var txtdiv2 = document.getElementById('mapaddrsnamesub');
        td02Text = document.createTextNode("「"+result.items[0].address+"」");
        if (txtdiv2.firstChild != null) txtdiv2.removeChild(txtdiv2.firstChild);
        txtdiv2.appendChild(td02Text);
    }
}
