if (typeof(QLife) == 'undefined') {
    var QLife = {};
}


QLife.TopMap = {
    
    bhmModuleName : '',

    SELECT_PREF : '',

    SELECT_RAIL : '',

    SELECT_STATION : '',
    /**
     * 郵便番号検索: 郵便番号select(3桁)
     */
    SELECT_ZIP1 : '',
    /**
     * 郵便番号検索: 郵便番号select(4桁)
     */
    SELECT_ZIP2 : '',
    /**
     * 郵便番号検索: 住所一覧div
     */
    DIV_ADDRESS_LIST : '',
    /**
     * 病院一覧div
     */
    DIV_HOSPITAL_LIST : '',
    
    DIV_MAP : '',

    init : function(bhmModuleName, selectPrefId, selectRailId, selectStationId, selectZip1Id, selectZip2Id, divAddressId, divHospitalId, divMap){
		this.bhmModuleName = bhmModuleName;
        this.SELECT_PREF = selectPrefId;
        this.SELECT_RAIL = selectRailId;
        this.SELECT_STATION = selectStationId;
        this.SELECT_ZIP1 = selectZip1Id;
        this.SELECT_ZIP2 = selectZip2Id;
        this.DIV_ADDRESS_LIST = divAddressId;
        this.DIV_HOSPITAL_LIST = divHospitalId;
        this.DIV_MAP = divMap;
        //
        $(this.SELECT_PREF).onchange = function(){ QLife.TopMap.prefChanged(); };
        $(this.SELECT_RAIL).onchange = function(){ QLife.TopMap.railChanged(); };
        $(this.SELECT_STATION).onchange = function(){ QLife.TopMap.stationChanged(); };
//        $(this.SELECT_ZIP1).onkeyup = function(){ QLife.TopMap.updateZipcodeAreas(); };
//        $(this.SELECT_ZIP2).onkeyup = function(){ QLife.TopMap.updateZipcodeAreas(); };
        // ブラウザ履歴: UI状態を復帰
        this._restoreState();
    },
    /**
     * 初期状態文字列
     */
    initState : '',
    /**
     * ブラウザ履歴: 初期状態を記憶 (復帰処理はonloadで行う)
     *
     * @param string state 状態文字列
     */
    restore : function(state){
        this.initState = String(state);
    },
    /**
     * ブラウザ履歴: 状態を復帰
     */
    _restoreState : function(){
        if (this.initState == null || this.initState == '') {
            return;
        }
        var params = this.initState.split('_');
        if (params.length < 7 || params[0] != 1) {
            return;
        }
        var lat     = decodeURIComponent(params[1]);
        var lon     = decodeURIComponent(params[2]);
        var layer   = decodeURIComponent(params[3]);
        var pref    = decodeURIComponent(params[4]);
        var rail    = decodeURIComponent(params[5]);
        var station = decodeURIComponent(params[6]);
        // 都道府県プルダウンの状態を復帰
        QLife.Common.restoreSelect(this.SELECT_PREF, pref);
        // 路線プルダウン更新と同時に、アクティブな路線、駅を選択
        this.prefChanged(rail, station);
        // 地図の状態を復帰
        this.initMap(lat, lon, layer);
    },
    /**
     * 現在表示中の駅リスト(マップ＆駅チカ病院検索)
     */
    currentStations : null,
    /**
     * タブ2: 都道府県プルダウンリストが変更されたとき
     *
     * @param int selectedRail 路線プルダウン更新後、選択状態にする路線
     * @param int selectedStation 駅プルダウン更新後、選択状態にする駅
     */
    prefChanged : function(selectedRail, selectedStation){
        var pref = $F(this.SELECT_PREF);
        // 不正なidのとき、離脱
        if (isNaN(pref) || pref < 1 || pref > 47) {
           return false;
        }

        new Ajax.Request('/pet/toppage_tab2_rail.php', {
            method : 'get',
            parameters : {pref : pref},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                if (json.err) {
                   // エラー
                   alert(json.err);
                   return;
                }
				// 正常終了: 路線更新
		        var slRail = $(QLife.TopMap.SELECT_RAIL);
		        var slStation = $(QLife.TopMap.SELECT_STATION);
		        // 路線と駅の<option>を削除
		        QLife.Common.removeOptions(slRail);
		        QLife.Common.removeOptions(slStation);
		        QLife.TopMap.currentStations = null;
		        // 路線リスト<option>の追加
		        var rails = (typeof(json.xml.rail.length) == 'undefined' ? [json.xml.rail] : json.xml.rail);
		        for (var i = 0, length = rails.length ; i < length ; i++) {
		            slRail.options[i + 1] = new Option(rails[i].name, rails[i].code);
		            // 
		            if (selectedRail == rails[i].code) {
	                    slRail.options[i + 1].selected = true;
//                        alert('selected rail=' + rails[i].code);
		            }
		        }
		        // 駅が指定されているとき、駅プルダウン更新
		        if (selectedStation != null && ! isNaN(selectedStation) && String(selectedStation) != '') {
		            QLife.TopMap.railChanged(selectedStation);
		        }
            }
            });
    },
    /**
     * タブ2: 路線が変更されたとき
     *
     * @param int selectedStation 駅プルダウン更新後、選択状態にする駅
     */
    railChanged : function(selectedStation){
        var rail = $F(this.SELECT_RAIL);
//        alert('railChanged: id=' + this.SELECT_RAIL + ' val=' + rail);
        // 不正なidのとき、離脱
        if (isNaN(rail)) {
           return false;
        }

        new Ajax.Request('/pet/toppage_tab2_rail.php', {
            method : 'get',
            parameters : {rail : rail},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                if (json.err) {
                    // エラー
                    alert(json.err);
                    return;
                }
                // 正常終了: 駅一覧を更新
			    // 取得した駅リストを保存
			    QLife.TopMap.currentStations = json.xml.station;
			    var slStation = $(QLife.TopMap.SELECT_STATION);
			    // 駅リストの<option>を削除
			    QLife.Common.removeOptions(slStation);
			    // 駅リスト<option>の追加
			    var stations = (typeof(json.xml.station.length) == 'undefined' ? [json.xml.station] : json.xml.station);
			    for (var i = 0, length = stations.length ; i < length ; i++) {
			        slStation.options[i + 1] = new Option(stations[i].name, stations[i].code);
			        if (selectedStation == stations[i].code) {
			            slStation.options[i + 1].selected = true;
//			            alert('selected station=' + selectedStation);
			        }
			    }
		    }
        });
    },
    /**
     * タブ2: 駅を変更したとき
     */
    stationChanged : function(){
        // 選択した駅コード
        var currentCode = $F(this.SELECT_STATION);
        if (currentCode == null || isNaN(currentCode)) {
            return;
        }
        // 選択した駅の座標を検索
        var stations = this.currentStations;
        for (var i = 0 ; i < stations.length ; i++) {
            // 地図更新(選択した駅)、病院検索更新
            if (currentCode == stations[i].code) {
                // 中心移動 (移動時イベントによって病院一覧が更新)
                this.yahooMap.moveTo(stations[i].lat + "," + stations[i].long);
                break;
            }
        }
    },
    /**
     * 郵便番号検索: 郵便番号が変更されたとき、地域リストを更新
     */
    updateZipcodeAreas : function(){
        var  zipcode = $F(this.SELECT_ZIP1) + $F(this.SELECT_ZIP2);
        if (zipcode.match(/^[0-9]{7}$/)) {
        } else {
            return;
        }
        // 待機画像
        $(this.DIV_ADDRESS_LIST).innerHTML = QLife.Common.IMG_LOADING;

        new Ajax.Request('/pet/zipcode.php', {
            method : 'get',
            parameters : {zipcode : zipcode},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                var html = '';
                if (json == null || typeof(json.kenname) == 'undefined') {
                    html = '不明な郵便番号です';
                } else {
                    html = '<a href="javascript:void(0);" onclick="QLife.TopMap.yahooMap.moveTo(\'' +
                        json.latitude + ',' + json.longitude + '\');">' +
                        (json.kenname + json.cityname + json.name).escapeHTML() + '</a><br />';
                }
                $(QLife.TopMap.DIV_ADDRESS_LIST).innerHTML = html;
            }
        });
    },
    
    /**
     * Y!地図オブジェクト
     */
    yahooMap : null,
    /**
     * Y!地図の初期化
     */
    initMap : function(lat, lon, layer){
        // すでに初期化済みのとき、離脱
        if (this.yahooMap != null) {
            return;
        }
//        alert('TopMap.initMap()');
        var pos = '';
        if (lat != '' && lon != '') {
            // 移動経度が指定されている(ブラウザ履歴復帰時):
            pos = lat + ',' + lon;
        } else if (typeof(SURFPOINT) == 'undefined') {
	        // どこどこAPIが使用可能: 都道府県庁の緯度経度取得(どこどこJP)
            pos = '35.40.39.980,139.46.13.730';
        } else {
            // それ以外:
            pos = SURFPOINT.getLat() + ',' + SURFPOINT.getLng();
        }
        // 拡大率
        if (layer == null || isNaN(layer) || layer == '') {
            layer = 3;
        }
        // 地図初期化
        this.yahooMap = new YahooMapsCtrl(this.DIV_MAP, pos, layer, YMapMode.Map,YDatumType.WGS84);
        // オリジナルアイコン
        this.yahooMap.addCategory('qlife_mappin', '/pet/images/icon_mappin.png');
        // 表示領域変更時の処理追加
        this.yahooMap.addEvent(YEventType.MAP_MOVED,
            function(){
                QLife.TopMap.mapMoved();
            }
        );
    },
    
    mapMoved : function(){
        var pos = this.yahooMap.getCenter();
        var layer = this.yahooMap.getCurrentLayer();
        var pref    = $F(this.SELECT_PREF);
        var rail    = $F(this.SELECT_RAIL);
        var station = $F(this.SELECT_STATION);
        // 状態文字列を作成
        var state = '1_' + encodeURIComponent(pos.lat) +
            '_' + encodeURIComponent(pos.lon) +
            '_' + encodeURIComponent(layer) +
            '_' + encodeURIComponent(pref) +
            '_' + encodeURIComponent(rail) +
            '_' + encodeURIComponent(station);
        if (this.bhmModuleName == '') {
            QLife.TopMap.updateMap(state);
        } else {
            try {
                YAHOO.util.History.navigate(QLife.TopMap.bhmModuleName, state);
            } catch(e) {
	            QLife.TopMap.updateMap(state);
            }
        }
    },
    /**
     * 地図上に表示するアイコンの上限数
     */
    LIMIT_ICONS : 16,
    /**
     * Y!地図の領域移動時 (病院リストの更新、アイコンの更新)
     */
    updateMap : function(state){
        var params = state.split('_');
        //
        if (params.length < 7) {
//            alert('tab2[227]: Invalid state=' + state);
            return;
        }
        var tabIndex = decodeURIComponent(params[0]);
        if (String(tabIndex) != '1') {
//            alert('tab2[232]: Invalid state=' + state);
            return;
        }
        var map = this.yahooMap;
        // 広域の検索を禁止
        if (map.getCurrentLayer() > 4) {
           return;
        }
        // 領域の緯度経度取得
        var posTR = map.getTopRight();
        var posBL = map.getBottomLeft();
        // 待機画像
        $(this.DIV_HOSPITAL_LIST).innerHTML = QLife.Common.IMG_LOADING;
        
        new Ajax.Request('toppage_hospital.php', {
            method : 'get',
            parameters : {
                stype : 1,
                lat1 : posBL.lat, long1 : posBL.lon,
                lat2 : posTR.lat, long2 : posTR.lon
                },
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                $(QLife.TopMap.DIV_HOSPITAL_LIST).innerHTML = json.html;
                // 地図アイコンの設定
                var map = QLife.TopMap.yahooMap;
                map.clearIcon();
                var hospitals = (typeof(json.xml.hospital.length) == 'undefined'? [json.xml.hospital] : json.xml.hospital);
                for (var i = 0, length = hospitals.length ; i < length && i < QLife.TopMap.LIMIT_ICONS ; i++) {
                    var rec = hospitals[i];
                    var id = String(rec.id).escapeHTML();
                    var name = String(rec.name).escapeHTML();
                    var addr = String(rec.addr).escapeHTML();
                    var popup = '<a href="hospital_detail_' + id + '_1">' + name + '</a><br />' + addr;
                    map.addIcon(id, String(rec.lat) + ',' + String(rec.long), popup, 'qlife_mappin');
                }
            }
        });
    }
};
