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

// RHS初期化 - 1
/*
window.dhtmlHistory.create({
    toJSON: function(o) {
        return Object.toJSON(o);
    }
    , fromJSON: function(s) {
        return s.evalJSON();
    }
});
*/

QLifePet.Common.addOnload(
    function(){
        QLifePet.Toppage.initTabView();
        // RHS初期化 - 2
	    dhtmlHistory.initialize();
        dhtmlHistory.addListener(QLifePet.Toppage.restoreHistory);
    }
);


QLifePet.Toppage = {
    tabView : null,
    
    pathnames : ['/pet/', '/pet/toppage_map', '/pet/toppage_animal'],
    
    initTabView : function(){
        if (this.tabView != null) {
            return;
        }
        // タブ初期化
        this.tabView = new YAHOO.widget.TabView('toppage_tabs'); 
        // タブ切り替えイベント (地図初期化、GA追跡処理)
        for (var i = 0 ; i < 3 ; i++) {
	        // タブ2のクリックイベント: Y!地図初期化
	        this.tabView.getTab(i).addListener('click',
                function(e){
                    var activeIndex = QLifePet.Toppage.tabView.get('activeIndex');
                    // index=1のとき、地図初期化
                    if (activeIndex == 1) {
	                    QLifePet.Toppage.initMap();
                    }
                    // GA追跡処理
                    var pathname = QLifePet.Toppage.pathnames[activeIndex];
                    QLifePet.Common.gaTrack(pathname);
                }
            );
        }

        dhtmlHistory.initialize();
        dhtmlHistory.addListener(QLifePet.Toppage.restoreHistory);
    },
    
    /**
     * ブラウザ履歴: 履歴を追加
     */
    addHistory : function(){
        var state = [
            this.tabView.get('activeIndex'),
            this.tab2State.CenterLat,
            this.tab2State.CenterLon,
            this.tab2State.Layer,
            this.tab3State.Step1,
            this.tab3State.Step2,
            this.tab3State.Step3,
            this.tab3State.Page
            ];
        var newState = state.join('_');
//        alert('add: newState=' + newState);
        dhtmlHistory.add(newState, null);
    },
    /**
     * ブラウザ履歴: 状態を復帰
     * (this参照禁止…dhmlHistoryのイベントハンドラに設定されているため)
     */
    restoreHistory : function(newLocation, historyData){
//        alert('resotre: newLocation=' + newLocation);
        var state = newLocation.split('_');
        if (state.length < 8) {
//            alert('invalid state length=' + state.length);
            return;
        }
        // アクティブなタブ変更
        var activeIndex = state[0];
        var obj = QLifePet.Toppage;
        obj.tabView.set('activeIndex', activeIndex);
        // タブの状態を更新
        if (activeIndex == 1) {
            // タブ2
            obj.initMap();
	        obj.tab2State.CenterLat = state[1];
	        obj.tab2State.CenterLon = state[2];
	        obj.tab2State.Layer = state[3];
//	        alert('restore: lat=' + state[1] + ' lon=' + state[2] + ' layer=' + state[3]);
            // 緯度経度が数値のとき、地図移動
            if (! isNaN(obj.tab2State.CenterLat) && ! isNaN(obj.tab2State.CenterLon)) {
//                alert('restore: moveTo !');
	            obj.yahooMap.moveTo(obj.tab2State.CenterLat + ',' + obj.tab2State.CenterLon);
            }
            // レイヤ(縮尺)が数値のとき、地図更新
            if (! isNaN(obj.tab2State.Layer) && obj.tab2State.Layer != obj.yahooMap.getCurrentLayer()) {
//                alert('restore: change layer !');
	            obj.yahooMap.setLayer(obj.tab2State.Layer);
            }
        } else if (activeIndex == 2) {
            // タブ3
	        obj.tab3State.Step1 = state[4];
	        obj.tab3State.Step2 = state[5];
	        obj.tab3State.Step3 = state[6];
	        obj.tab3State.Page  = state[7];
//            alert('restore: tab1=' + obj.tab3State.Step1 + ' tab2=' + obj.tab3State.Step2 + ' tab3=' + obj.tab3State.Step3 + ' page=' + obj.tab3State.Page);

	        QLifePet.Common.restoreSelect(obj.TAB3_SELECT_STEP1, obj.tab3State.Step1);
            QLifePet.Common.restoreSelect(obj.TAB3_SELECT_STEP2, obj.tab3State.Step2);
            obj.areaCondChanged(obj.tab3State.Step3, obj.tab3State.Page, false);
        }
    },
    
    /**
     * 共通: selectのoptionを削除(先頭を除く)
     *
     * @param Element sl select要素
     */
    removeOptions : function(sl){
        sl.selectedIndex = 0;
        var len = sl.options.length;
        for (var i = 1 ; i < len; i++) {
            sl.options[1] = null;
        }
    },

    /**
     * タブ2 - マップ＆駅チカ病院検索
     */

    /**
     * タブ2: 都道府県プルダウンリストが変更されたとき
     *
     * @param string selectPrefId 都道府県selectのid
     * @param string selectRailId 路線selectのid
     * @param string selectStationId 駅selectのid
     */
    prefChanged : function(selectPrefId, selectRailId, selectStationId){
        var pref = $F(selectPrefId);
        // 不正なidのとき、離脱
        if (isNaN(pref) || pref < 1 || pref > 47) {
           return false;
        }

        new Ajax.Request('toppage_tab2_rail.php', {
            method : 'get',
            parameters : {pref : pref},
            onSuccess : function(transport) {
	            var json = transport.responseText.evalJSON();
	            if (json.err) {
	               // エラー
	               alert(json.err);
	            } else {
	               　               // 正常終了: 路線更新
		            QLifePet.Toppage.updateRail(json.xml, selectRailId, selectStationId);
	            }
	        }
            });
    },
    /**
     * タブ2: 都道府県選択→路線プルダウンの更新
     *
     * @param object json            非同期更新によって返却されたjsonオブジェクト
     * @param string selectRailId    更新する路線selectのid
     * @param string selectStationId 駅selectのid
     */
    updateRail : function(json, selectRailId, selectStationId){
        var slRail = $(selectRailId);
        var slStation = $(selectStationId);
        // 路線と駅の<option>を削除
        this.removeOptions(slRail);
        this.removeOptions(slStation);
        this.currentStations = null;
        // 路線リスト<option>の追加
        var rails = (typeof(json.rail.length) == 'undefined' ? [json.rail] : json.rail);
        for (var i = 0, length = rails.length ; i < length ; i++) {
            slRail.options[i + 1] = new Option(rails[i].name, rails[i].code);
        } 
    },
    /**
     * タブ2: 路線が変更されたとき
     *
     * @param string selectRailId 路線selectのid
     * @param string selectStationId 駅selectのid
     */
    railChanged : function(selectRailId, selectStationId){
        var rail = $F(selectRailId);
        // 不正なidのとき、離脱
        if (isNaN(rail)) {
           return false;
        }

        new Ajax.Request('toppage_tab2_rail.php', {
            method : 'get',
            parameters : {rail : rail},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                if (json.err) {
                    // エラー
                    alert(json.err);
                } else {
                    // 正常終了: 駅一覧を更新
	                QLifePet.Toppage.updateStation(json.xml, selectStationId);
                }
            }
            });
    },
    /**
     * 現在表示中の駅リスト(マップ＆駅チカ病院検索)
     */
    currentStations : null,
    /**
     * タブ2: 駅プルダウンリストを更新
     *
     * @param object json JSONオブジェクト
     * @param string selectStationId 駅selectのid
     */
    updateStation : function(json, selectStationId){
	    // 取得した駅リストを保存
	    this.currentStations = json.station;

        var slStation = $(selectStationId);
        // 駅リストの<option>を削除
        this.removeOptions(slStation);
        // 駅リスト<option>の追加
        var stations = (typeof(json.station.length) == 'undefined' ? [json.station] : json.station);
        for (var i = 0, length = stations.length ; i < length ; i++) {
            slStation.options[i + 1] = new Option(stations[i].name, stations[i].code);
        } 
    },
    /**
     * タブ2: 駅を変更したとき
     *
     * @param string selectStationId 駅selectのid
     * @param string divListId 病院リストdivのid
     */
    stationChanged : function(selectStationId, divListId){
        var slStation = $(selectStationId);
        // 選択した駅IDが存在し、表示中駅リストがあるとき、処理を続行
        if (slStation && slStation.selectedIndex > -1 && this.currentStations != null) {
        } else {
	        return false;
        }
        // 選択した駅コード
        var currentCode = slStation.options[slStation.selectedIndex].value;
        // 選択した駅の座標を検索
        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;
	        }
        }
    },
    
    /**
     * タブ2: 郵便番号検索
     */
    
    /**
     * 郵便番号検索: 郵便番号が変更されたとき、地域リストを更新
     */
    updateZipcodeAreas : function(zip1Id, zip2Id, listId){
        var  zipcode = $F(zip1Id) + $F(zip2Id);
        if (zipcode.match(/^[0-9]{7}$/)) {
        } else {
            return;
        }
        // 待機画像
        $(listId).innerHTML = QLifePet.Common.IMG_LOADING;

        new Ajax.Request('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="QLifePet.Toppage.yahooMap.moveTo(\'' +
	                    json.latitude + ',' + json.longitude + '\');">' +
	                    (json.kenname + json.cityname + json.name).escapeHTML() + '</a><br />';
                }
                $(listId).innerHTML = html;
            }
        });
    },
    
    /**
     * Y!地図オブジェクト
     */
    yahooMap : null,
    /**
     * Y!地図の初期化
     */
    initMap : function(){
        if (this.yahooMap == null) {
	        // 地図初期化
	        this.yahooMap = new YahooMapsCtrl("map", "35.40.39.980,139.46.13.730", 3, YMapMode.Map,YDatumType.WGS84);
	        // オリジナルアイコン
	        this.yahooMap.addCategory('qlife_mappin', '/pet/images/icon_mappin.png');
	        // 表示領域変更時の処理追加
	        this.yahooMap.addEvent(YEventType.MAP_MOVED,
                function(){
                    QLifePet.Toppage.updateMap();
                }
            );
        }
    },
    /**
     * タブ2: ブラウザヒストリ状態
     */
    tab2State : {CenterLat : '', CenterLon : '', Layer : ''},
    /**
     * タブ2: 病院一覧 表示領域divのid
     */
    DIVID_HOSPITAL_LIST : 'tab2_hospital_list',
    /**
     * Y!地図の領域移動時 (病院リストの更新、アイコンの更新)
     */
    updateMap : function(){
	    var map = this.yahooMap;
	    // 広域の検索を禁止
	    if (map.getCurrentLayer() > 4) {
	       return;
	    }
	    // 待機画像
        $(this.DIVID_HOSPITAL_LIST).innerHTML = QLifePet.Common.IMG_LOADING;
        // 領域の緯度経度取得
        var posTR = map.getTopRight();
        var posBL = map.getBottomLeft();
        // 緯度経度を保存、ブラウザ履歴を追加
        var center = map.getCenter();
        this.tab2State.CenterLat = center.lat;
        this.tab2State.CenterLon = center.lon;
        this.tab2State.Layer = map.getCurrentLayer();
        this.addHistory();

        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();
	            $(QLifePet.Toppage.DIVID_HOSPITAL_LIST).innerHTML = json.html;
	            // 地図アイコンの設定
	            var map = QLifePet.Toppage.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++) {
                    var rec = hospitals[i];
                    var popup = '<a href="hospital_detail_' + rec.id.escapeHTML() + '_1">' +
                        rec.name.escapeHTML() + '</a><br />' + rec.addr.escapeHTML();
                    map.addIcon(rec.id, rec.lat + ',' + rec.long, popup, 'qlife_mappin', rec.name);
	            }
            }
            });
    },
    
    /**
     * タブ3 - 診療動物検索
     */

    /**
     * タブ3: 診療動物または都道府県のプルダウンリストが変更されたとき
     *
     * @param int     selectedIndex 選択するoptionの既定インデックス。1以上のとき、同時に病院リストも更新
     * @param int     page          病院リストの表示ページ数(1-)。0のとき、病院リストは更新しない
     * @param boolean enableHistory ブラウザ履歴管理を有効にするか
     */
    areaCondChanged : function(selectedIndex, page, enableHistory){
        var subject = $F(this.TAB3_SELECT_STEP1);
        if (! isNaN(subject)) {
            var spans = $$('div.guide_container span');
            for (var i = 0, length = spans.length ; i < length ; i++) {
                if (spans[i] && spans[i].id) {
	                var display = ('subject_desc' + subject == spans[i].id ? 'inline' : 'none');
	                spans[i].setStyle({display : display});
                }
            }
        }
        var pref    = $F(this.TAB3_SELECT_STEP2);
        if (isNaN(subject) || isNaN(pref)) {
            return;
        }

        new Ajax.Request('toppage_tab3_area.php', {
            method : 'get',
            parameters : {subject : subject, pref : pref},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                if (json.err) {
                    // エラー
                    alert(json.err);
                } else {
                    // 正常終了: 地域一覧を更新
	                QLifePet.Toppage.updateArea(json.xml);
	                // 
	                if (selectedIndex > 0 && page > 0) {
                        QLifePet.Common.restoreSelect(QLifePet.Toppage.TAB3_SELECT_STEP3, selectedIndex);
	                    QLifePet.Toppage.areaChanged(page, enableHistory);
	                }
                }
            }
            });
    },
    
    /**
     * タブ3: 市区町村プルダウンリストを更新
     *
     * @param object json         JSONオブジェクト
     */
    updateArea : function(json){
        var slArea = $(this.TAB3_SELECT_STEP3);
        // 市区町村(Step3)の<option>を削除
        this.removeOptions(slArea);
        // 市区町村(Step3)の<option>を追加
        var areas = (typeof(json.area.length) == 'undefined' ? [json.area] : json.area);
        for (var i = 0, length = areas.length ; i < length ; i++) {
            slArea.options[i + 1] = new Option(areas[i].name + '(' + areas[i].num + ')', areas[i].name);
        }
    },
    /**
     * タブ3状態
     */
    tab3State : {Step1 : '', Step2 : '', Step3 : '', Page : ''},
    
    TAB3_SELECT_STEP1 : 'tab3_step1',
    TAB3_SELECT_STEP2 : 'tab3_step2',
    TAB3_SELECT_STEP3 : 'tab3_step3',
    TAB3_DIV_HOSPITAL_LIST : 'tab3_hospital_list',
    
    currentAnimal : 0,
    /**
     * タブ3: 市区町村選択 → 病院リストを更新
     *
     * @param int     page          診療動物
     * @param boolean enableHistory 都道府県selectのid
     */
    areaChanged : function(page, enableHistory){
        var subject = $F(this.TAB3_SELECT_STEP1);
        var pref    = $F(this.TAB3_SELECT_STEP2);
        var area    = $F(this.TAB3_SELECT_STEP3);
        if (isNaN(subject) || isNaN(pref) || area.length == 0) {
            return;
        }
        this.currentAnimal = subject;
        // 待機画像
        $(this.TAB3_DIV_HOSPITAL_LIST).innerHTML = QLifePet.Common.IMG_LOADING;
        // 状態を保存、ブラウザ履歴を追加
        if (enableHistory) {
	        this.tab3State.Step1 = $(this.TAB3_SELECT_STEP1).selectedIndex;
	        this.tab3State.Step2 = $(this.TAB3_SELECT_STEP2).selectedIndex;
	        this.tab3State.Step3 = $(this.TAB3_SELECT_STEP3).selectedIndex;
	        this.tab3State.Page  = page;
	        this.addHistory();
        }

        new Ajax.Request('toppage_hospital.php', {
            method : 'get',
            parameters : {stype : 2, subject : subject, pref : pref, area : area, page : page},
            onSuccess : function(transport) {
                var json = transport.responseText.evalJSON();
                $(QLifePet.Toppage.TAB3_DIV_HOSPITAL_LIST).innerHTML = json.html;
                // ページャーに非同期更新イベント設定
                var anchors = $$('div.pager a');
                for (var i = 0 ; i < anchors.length ; i++) {
                    anchors[i].onclick = function(){
                        // hrefテキストからページ数を取得
                        var newpage = this.href.replace(/^.+page=(\d+).*$/, '$1');
                        QLifePet.Toppage.areaChanged(newpage, true);
                        return false;
                    }
                }
            }
            });
    }
};


