
var geocoder = null;
var map = null;

var markers = new Array(); // マーカーのリスト
var parkingList = new Array(); // 駐車場リストデータ
var listStringArray = new Array();
var notMove = false;

var LIST_DELTA = 10;
var DEFAULT_LAT = 35.1707914371233;
var DEFAULT_LNG = 136.88153743743896;
var MAX_ZOOM = 10;
var DEFAULT_ZOOM = 15;
//var MARKER_N_IMG = "./img/map/marker_n.png";
var MARKER_ARRAY = ["./img/map/pa_map_lv00.png","./img/map/pa_map_lv01.png","./img/map/pa_map_lv02.png","./img/map/pa_map_lv03.png"]
var MARKER_MKP_ARRAY = ["./img/map/pa_map_lv00.png","./img/map/pa_map_mkp_lv01.png","./img/map/pa_map_mkp_lv02.png","./img/map/pa_map_mkp_lv03.png"]
var LIST_IOCN = ["./img/map/pa_lv00.png","./img/map/pa_lv01.png","./img/map/pa_lv02.png","./img/map/pa_lv03.png"];
var LIST_MKP_IOCN = ["./img/map/pa_lv00.png","./img/map/pa_mkp_lv01.png","./img/map/pa_mkp_lv02.png","./img/map/pa_mkp_lv03.png"];
var MARKER_N_IMG = "./img/map/pa_map_lv00.png";
var MARKER_O_IMG = "./img/map/marker_o.png";
var SHADOW_N_IMG = "./img/map/shadow_n.png";
var SHADOW_O_IMG = "./img/map/shadow_n.png";
var SELECT_MARKER_IMG = "./img/map/select_marker.gif";

var icon_n = new GIcon();
var icon_o = new GIcon();
var select_icon =  new GIcon();
var select_marker;

var parkingJson = new Object;

var LatLngCenter = null;

var selectedParkID = null;

var draged = false;

var LISTSEARCH_FIRST = 1;
var LISTSEARCH_AFTER = 0;

var flg_init_search = true;

/**
 * Gmap 初期化処理
 */
function load() {

    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("google_api"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        //map.addControl(new GOverviewMapControl());
        
        geocoder = new GClientGeocoder();   
    }
    
    if (address != "") {
        showAddress(address); // getDisplayMapListはcallbackで実行
    } else if(lat != "0" && lng != "0") {
        LatLngCenter = new GLatLng(lat, lng);
        map.setCenter(LatLngCenter, getZoomValue(lat, lng, 1));
        getDisplayMapList(1);
    } else if(parking_lat != "" && parking_lng != ""){
        LatLngCenter = new GLatLng(parking_lat, parking_lng);
        map.setCenter(LatLngCenter, getZoomValue(parking_lat, parking_lng, 1));
        getDisplayMapList(1);
    } else {
        LatLngCenter = new GLatLng(DEFAULT_LAT, DEFAULT_LNG);
        map.setCenter(LatLngCenter, DEFAULT_ZOOM); // 名古屋
        getDisplayMapList(1);
    }

    initMarker();
    initAddresTextField();
    
    /**
     * マーカーオブジェクトを初期化
     */
    function initMarker() {

        // 画像iconを設定
        //icon_n.image = MARKER_N_IMG;
        icon_n.iconSize = new GSize(29, 36);
        icon_n.iconAnchor = new GPoint(14, 36);
        icon_n.infoWindowAnchor = new GPoint(0, 0);
        icon_n.shadow = SHADOW_N_IMG;
        icon_n.shadowSize = new GSize(58, 34);

        icon_o.image = MARKER_O_IMG;
        icon_o.iconSize = new GSize(20, 34);
        icon_o.iconAnchor = new GPoint(14, 36);
        icon_o.infoWindowAnchor = new GPoint(0, 0);
        icon_o.shadow = SHADOW_O_IMG;
        icon_o.shadowSize = new GSize(37, 34);

        // select
        select_icon.image = SELECT_MARKER_IMG;
        select_icon.iconSize = new GSize(47, 47);
        select_icon.iconAnchor = new GPoint(23, 45);
        select_icon.infoWindowAnchor = new GPoint(0, 0);
        //select_icon.shadow = SHADOW_O_IMG;
        //select_icon.shadowSize = new GSize(37, 34);

    }


    /**
     * 住所のテキストフィールドを初期化
     */
    function initAddresTextField() {
        var v = $("#se_01_text");
        var str = "住所を入力してください";
        if ($.trim(v.val()) == "" || $.trim(v.val()) == str) {
            v.one("focus", function() {
                v.val("");
            });
            v.val(str);
        }
        $("#se_01_bt").click(function(e) {            
            if ($.trim(v.val()) == "" || v.val() == str) {
                alert("住所を入力してください");
                v.focus();
            } else {
                document.search.submit();
            }

        });
    }    

}


/**
 * 入力された文字列から住所検索
 */
function showAddress(adr) {
    if (geocoder) {
        geocoder.getLatLng(
            adr,
            function(p) {
                if (!p) {
                    // 存在しない場合は名古屋を中心に
                    alert("「" + adr + "」" + " は見つかりませんでした。\n名古屋駅周辺の地図を表示します。");
                    map.setCenter(new GLatLng(DEFAULT_LAT, DEFAULT_LNG), DEFAULT_ZOOM);
                } else {
                    map.setCenter(p, getZoomValue(p.lat(), p.lng(), 1));
                }
                //getDisplayMapList(1);
            }
        );
    }
}

window.unonload = GUnload;

/**
 * onload
 */
$(function() {
    
    load();
    initRefine();
    
    // popupを
    // マップ移動時に通信
    GEvent.addListener(map, 'moveend',
                       function(overlay,point){
                           popupClose();
                           
                           // マーカークリック、リストクリックで通信しない
                           if (notMove) {
                               notMove = false;
                               return;
                           }
                           
                           // 経度緯度取得
                           var lng = (map.getCenter()).lng();
                           var lat = (map.getCenter()).lat();
						   
                           getDisplayMapList(1);
                           
                       });

    GEvent.addListener(map, 'dragend',
                       function(overlay,point){
                           //一回でも動かしたことを記憶
                           draged = true;
                       });

});

/**
 * パーキングリストを取得
 *
 * @param page ページ指定
 */
function getDisplayMapList(page) {

    showLoading();
    
    // 表示範囲をもとめる
    var rect  = map.getBounds();
    var span = rect.toSpan();
    var center = map.getCenter(); 
    
    if(flg_init_search){
        first_flg = LISTSEARCH_FIRST;
    }else{
        first_flg = LISTSEARCH_AFTER;
    }

    // 通信処理
    $.ajax({
        url : "mapapp/getParkingList.php",
        type : "post",
        dataType : "json",
        data : "lat="+center.lat()+"&lng="+center.lng()+"&latSpan="+span.lat()/2+"&lngSpan="+span.lng()/2+"&first_flg="+first_flg ,
        timeout : "10000",
        error : function() {
            hideLoading();
        },
        success : function(json) {
            parkingJson = json;
            //updateMap(json)
            checkRefineAll();
            //hideLoading();
            flg_init_search = false;
        }
        
    });
}

/**
 * 地図とリストをアップデート
 */
function updateMap(json, used_span) {
    
    clearMarker();
    listStringArray = new Array();
    var num=0;
    for (var i in json) {
        num++;
        addParking(json[i]);
        listStringArray.push(createListString(num, json[i]));
    }
    if (listStringArray.length >= 1) {
        createPager(listStringArray.length,LIST_DELTA);
    } else {
        noResult();
    }

    if (pid != "")  openInfoWindow(pid);
    pid = "";

}

/**

 * パーキングを地図に追加
 *
 * @param obj 駐車場オブジェクト
 */
function addParking(obj, icon) {    
    
    if (icon == null) icon = icon_n;

    if(CAMPAIGN_DISPLAY_MODE && obj.campaign_count != null && obj.campaign_count > 0){
        //キャンペーン用アイコン
        tgt_marker = MARKER_MKP_ARRAY;
    }else{
        //通常用アイコン
        tgt_marker = MARKER_ARRAY;
    }

    switch (obj.empty_full) {

    case "0":
        img = tgt_marker[1];
        break;
    case "1":
        img = tgt_marker[2];
        break;
    case "2":
        img = tgt_marker[3];
        break;
    default:
        img = tgt_marker[0];
        break;
    }
    
    // full_or_empty_manageが0の場合は満空を表示しない
    if (obj.full_or_empty_manage == 0) {
        img =tgt_marker[0];
    }
    
    icon.image = img;
    
    // マーカーを追加
    var m = new GMarker(new GLatLng(obj.entrance_lat, obj.entrance_lng),{icon:icon});
    map.addOverlay(m);

    // マーカのクリックイベントで吹き出し
    GEvent.addListener(m, "click", function() {
        openInfoWindow(obj.id);
    });

    /*
    GEvent.addListener(m, "mouseover", function() {
        markerSelectToggle(obj.id);
    });
    
    GEvent.addListener(m, "mouseout", function() {
        markerSelectToggle(obj.id);
    });
    */

    parkingList[obj.id] = obj;
    markers[obj.id] = m;
    
}


/**
 * 指定したピンに吹き出しを表示
 *
 * @param id 駐車場ID
 */
function openInfoWindow(id) {

    // 料金のデータ取得
    $.ajax({
        url : "mapapp/getParkingInfo.php",
        type : "post",
        dataType : "html",
        data : "id="+id ,
        timeout : "10000",
        error : function() {
        },
        success : function(html) {
            notMove = true;
            markers[id].openInfoWindow(html);
            selectedParkID = id;
        }
        
    });


}


/**
 * マーカーのみをクリア
 */
function clearMarker() {
    for ( var i in markers) map.removeOverlay(markers[i]);
    markers  = new Array();
}


/**
 * マーカーを選択
 */
function markerSelectToggle(id) {
    
    if (markers[id].marker_img == undefined)  markers[id].marker_img = MARKER_N_IMG;
    var img = (markers[id].marker_img == MARKER_N_IMG)? MARKER_O_IMG : MARKER_N_IMG;
    //markers[id].setImage(img);
    markers[id].marker_img = img;
    
    if (markers[id].marker_img != MARKER_N_IMG) {
        select_marker = new GMarker(new GLatLng(parkingList[id].entrance_lat, parkingList[id].entrance_lng),{icon:select_icon});
        map.addOverlay(select_marker);
    } else {
        map.removeOverlay(select_marker);
    }

}

// リスト関連 -------------------

/**
 * 表示用のリスト生成
 *
 * @param obj 駐車場オブジェクト
 */
function createListString(num, obj) {

    // 満車空車 0:空車, 1:混雑, 2:満車, 3:休止/閉鎖, 7:不明
    var icon = "";

    if(CAMPAIGN_DISPLAY_MODE && obj.campaign_count != null && obj.campaign_count > 0){
        //キャンペーン用アイコン
        tgt_icon = LIST_MKP_IOCN;
    }else{
        //通常アイコン
        tgt_icon = LIST_IOCN;
    }

    switch (obj.empty_full) {

    case "0":
        icon = tgt_icon[1];
        break;
    case "1":
        icon = tgt_icon[2];
        break;
    case "2":
        icon = tgt_icon[3];
        break;
    default:
        icon = tgt_icon[0];
        break;
    }
    
    // full_or_empty_manageが0の場合は満空を表示しない
    if (obj.full_or_empty_manage == 0) {
        icon = tgt_icon[0];
    }
    
    // 特徴アイコン積み上げ
    ref_icon = [];
    if(is_payment_pointcard(obj)){
        //ref_icon.push('refine_point.jpg');
        ref_icon.push('refine_point.png');
    }
    if(is_campaign(obj)){
        ref_icon.push('refine_campaign.png');
    }
    if(is_payment_businesscard(obj)){
        ref_icon.push('refine_business.png');
    }
    if(is_payment_giftcard(obj)){
        ref_icon.push('refine_gift.png');
    }
    if(is_closeout_charge(obj)){
        ref_icon.push('refine_max.png');
    }
    if(is_payment_creditcard(obj)){
        ref_icon.push('refine_credit.png');
    }
    if(is_payment_manaca(obj)){
        //ref_icon.push('refine_manaca.jpg');
        ref_icon.push('refine_manaca.png');
    }
    /*
    if(is_payment_edy(obj)){
        ref_icon.push('refine_edy.png');
    }
    */
    if(is_pcard_yellow(obj)){
        ref_icon.push('refine_pyellow.png');
    }else if(is_pcard_blue(obj)){
        ref_icon.push('refine_pblue.png');
    }

    ref_str = '';
    for(var iii = 0; iii<ref_icon.length; iii++){
        ref_str = ref_str + '<img src="img/map/new/' + ref_icon[iii] + '" />';  
    }
    if(ref_str != ''){
        ref_str = '<br /><div id="refine_icon">' + ref_str + '</div>';
    }

    // 駐車場名の切り詰め
    if (obj.name.length > 10) obj.name = obj.name.slice(0,10) + '...';
    
    return "<tr><td class=\"pl_no\">" + num + "</td>" +
        "<td class=\"pl_ic\">" +
        "<a href=\"javascript:openInfoWindow(\'"+obj.id+"\')\" onmouseover=\"javascript:markerSelectToggle(\'"+obj.id+"\')\" onmouseout=\"javascript:markerSelectToggle(\'"+obj.id+"\')\">" +
        "<img src=\""+icon+"\" alt=\"\" />" +
        "</a>" +
        "</td>" +
        "<td class=\"pl_name\">" +
        "<a href=\"javascript:openInfoWindow(\'"+obj.id+"\')\" onmouseover=\"javascript:markerSelectToggle(\'"+obj.id+"\')\" onmouseout=\"javascript:markerSelectToggle(\'"+obj.id+"\')\">" + obj.name + "</a>" +
        ref_str +
        "</td></tr>";
    
}


/**
 * リストを表示
 *
 * @param array リストの表示用文字列配列
 * @param page 現在ページ
 */
function displayList(page) {

    var start = LIST_DELTA*(page-1);
    var num = LIST_DELTA*page;
    var str = "";
    
    for (var i=start; i<num; i++) {
        if (listStringArray.length <= i) break;
        str += listStringArray[i];
    }
    
    $("#pl_table").html(str);
}


/**
 * ページ切り替え表示
 * ページを切り替えるごとに再描画
 *
 * @param len リストの長さ
 * @param delta 1ページのページ数
 */
function createPager(len, delta,currentPage) {

    if (currentPage==null) currentPage = 1;
    if (len < 1) return;
    
    displayList(currentPage);
    page = Math.ceil(len / delta);

    // 戻る
    // todo 件数
    var startNum = (delta*(currentPage-1)+1);
    var tmpNum = (delta*(currentPage-1)+delta);
    var endNum = (len < tmpNum)? len : tmpNum; 
    
    pagerString = len + "件中　" + startNum  + " - " + endNum  + " 件表示<br />";
    pagerString += (currentPage == 1)? "" : "<a href='javascript:createPager("+len+","+delta+","+(currentPage-1)+")'>&lt;</a>"

    // page link
    for (var i=1; i<=page; i++) {
        if (currentPage == i ) pagerString += " "+i+" ";
        else pagerString += " <a href='javascript:createPager("+len+","+delta+","+i+")'>"+i+"</a> ";
    }

    // 次へ
    pagerString += (currentPage == page)? "" : "<a href='javascript:createPager("+len+","+delta+","+(currentPage+1)+")'>&gt;</a>"
    
    $("#list_count").html(pagerString);
}


/**
 * 絞り込み用の設定
 */
function initRefine() {
    $("#sp_chbox input[@type=checkbox]").click(checkRefineAll);    
}


/**
 * 絞り込み処理
 */
function checkRefineAll(e) {

    showLoading()
    setTimeout(hoge, 500);
    
    function hoge(){
        
        // チェックされてる項目を取得
        var checkedArray = new Array();
        $("#sp_chbox input[@type=checkbox][checked]").each(function(){
            checkedArray.push($(this).attr("name"));
        });

        // GETにて指定された絞り込み項目を取得
        if(refine.length > 0){
            for(var iii = 0; iii < refine.length; iii++){
                $("#sp_chbox #" + refine[iii]).attr('checked',true);
            }
            // チェックボックス側に値が入っていることはありえないのでそのまま上書き
            checkedArray = refine;
            refine = [];  //初回の一回のみ有効
        }

        // 現在のオブジェクトを操作
        // forでまわして一つ一つチェック
        var refineObj = new Array();
        var len = parkingJson['list'].length;
        for (var i=0; i<len; i++) {
            if(checkRefine(parkingJson['list'][i], checkedArray)) {
                refineObj.push(parkingJson['list'][i]);
            }
        }
        updateMap(refineObj, parkingJson['used_span']);
        hideLoading();
    }
}

/**
 * 駐車場データが絞り込み条件にあうかどうか個別にチェック
 *
 * @param obj 駐車場データ
 * @param ary 条件
 */
function checkRefine(obj, ary) {

    for (var i in ary) {
        if (!eval(ary[i] + "(obj)")) return false;
    }

    return true;

    //MEMO : 以下関数名がGET対応におけるキーワードにもなる
    //       checkboxのidと紐付け(nameではない)
    function payment_creditcard(o) {
        return is_payment_creditcard(o);
    }

    /*
    function payment_edy(o) {
        return is_payment_edy(o);
    }
    */

    function pcard_blue(o) {
        return is_pcard_blue(o);
    }

    function pcard_yellow(o) {
        return is_pcard_yellow(o);
    }

    function closeout_charge(o) {
        return is_closeout_charge(o);
    }

    function payment_manaca(o){
        return is_payment_manaca(o);
    }

    function gift(o){
        return is_payment_giftcard(o);
    }

    function point(o){
        return is_payment_pointcard(o);
    }

    function biz(o){
        return is_payment_businesscard(o);
    }

    function campaign(o){
        return is_campaign(o);
    }
}

//
// 絞り込み検索に使用する判定関数
// 絞り込みと特徴アイコン両方で使うので外に出す
//
function is_payment_creditcard(o) {
    if (o.payment_creditcard  == "1") return true;
    return false;
}

/*
function is_payment_edy(o) {
    if (o.payment_edy == "1") return true;
    return false;
}
*/

function is_pcard_blue(o) {
    if (o.pcard_type == "2") return true;
    return false;
}

function is_pcard_yellow(o) {
    if (o.pcard_type == "1") return true;
    return false;
}

function is_closeout_charge(o) {
    if (Number(o.closeout_charge_count) > 0) return true;
    return false;
}

function is_payment_manaca(o){
    if (o.payment_manaca == "1") return true;
    return false;
}

function is_payment_pointcard(o){
    if (o.payment_pointcard == "1") return true;
    return false;
}

function is_payment_giftcard(o){
    if (o.payment_giftcard == "1") return true;
    return false;
}

function is_payment_businesscard(o){
    if (o.payment_housecard == "1") return true;
    return false;
}

function is_campaign(o){
    if (o.campaign_count != "" && o.campaign_count > 0) return true;
    return false;
}


/**
 * 検索結果が無い場合
 */
function noResult() {

    // リストのクリア
    clearList();
    //$("#list_count").html("この辺りにお探しの条件に合う駐車場はございません。");
    $("#list_count").html("<div id=\"list_notice\"><p>MAP内に該当する駐車場はございませんでした。<p></div><div id=\"list_helper\"><h3><b>検索のヒント</b></h3><p align=\"left\">絞り込み検索を行っている場合はチェックボックスを外してください。またお探しの地域の周辺には、駐車場がある場合がございます。<br /><br /></p><p><img src=\"img/map/maphelp1.gif\" border=\"1\"/>&nbsp;MAPを広域化</p></div>");
    // todo 無いことを明記
    
}

function showLoading() {
    $("#loading_daialog").show();
    clearList();
}

function hideLoading() {
    $("#loading_daialog").fadeOut("normal");
}


function clearList() {

    $("#list_count").html(" ");
    $("#pl_table").html(" ");

}


function popupOpen() {
    $("#manku").show();
}


function popupClose() {
    $("#manku").hide();    
}

/* 現在表示中の地図をURLとして表示する */
function getNowUrl(){

    nowurl = 'http://' + location.hostname + '/parking/info/map.php?';
    ret_ary = new Array();

    // 位置情報の確定
    infoObj = map.getInfoWindow();
    if(infoObj.isHidden()){
        if(draged == false && address != ''){
            /* 一度もドラッグしていない場合に限り住所をURLに反映 */
            ret_ary.push('address=' + address);
        }else{
            /* 現在の地図中心位置をそのまま取得反映 */
            ret_ary.push('lat=' + map.getCenter().lat());
            ret_ary.push('lng=' + map.getCenter().lng());
        }
    }else{
        /* ウィンドウ表示中：対象駐車場を反映 */
        ret_ary.push('parking_id=' + selectedParkID);
    }

    //絞り込み条件の確定 チェックボックスから取得
    if(isChecked("point")){
        ret_ary.push('point=1');
    }
    if(isChecked("campaign")){
        ret_ary.push('campaign=1');
    }
    if(isChecked("biz")){
        ret_ary.push('biz=1');
    }
    if(isChecked("gift")){
        ret_ary.push('gift=1');
    }
    if(isChecked("closeout_charge")){
        ret_ary.push('closeout_charge=1');
    }
    if(isChecked("payment_creditcard")){
        ret_ary.push('payment_creditcard=1');
    }
    if(isChecked("payment_manaca")){
        ret_ary.push('payment_manaca=1');
    }
    /*
    if(isChecked("payment_edy")){
        ret_ary.push('payment_edy=1');
    }
    */
    if(isChecked("pcard_yellow")){
        ret_ary.push('pcard_yellow=1');
    }
    if(isChecked("pcard_blue")){
        ret_ary.push('pcard_blue=1');
    }

    //ズーム追加（ユーザのズーム変更とJavaScriptのズーム変更を判別できないので強制付与で対応）
    ret_ary.push('zoom=' + map.getZoom());

    //URL整形して返す
    return nowurl + ret_ary.join('&');

    function isChecked(param){
        return document.getElementById(param).checked;
    }
}

//URLコピーポップアップ制御
function urlCopyOpen() {
    //document.getElementById("url_copy_insert_here").innerHTML = getNowUrl();
    objTextarea = document.getElementsByName("url_copy_insert_here")[0];
    objTextarea.value = encodeURI(getNowUrl());
    $("#urlcopy").show();
}


function urlCopyClose() {
    $("#urlcopy").hide();    
}

