//  ========================================================
//  mashmap.js
//  Original:http://api.chamap.net/MashMap/
//  Auther:Kentaro
//  version:1.0
//  機能:MashMapCore処理,共通関数
//  ========================================================

var MashMap = {
    Load: function(m, op) {
        var v = function() {
            if (MashMap.INI == undefined) alert("MashMaps定義[MashMap.INI]を記入して下さい。");
            //APIをリスト化、オプション指定が無ければマニフェストすべてをロード
            if (op == undefined || op.length == 0) each(MashMap.INI, function(o) { MashMap._APIList.push(o) });
            else MashMap._APIList = op;
            MashMap._APIList.each(function(o) {
                var v = eval(o); MashMap.APIs.push(v);
                if (MashMap.INI[o].key != undefined) { if (MashMap.INI[o].key == "") return; v.key = MashMap.INI[o].key };
                v.LV = MashMap.INI[o].LV == undefined ? 15 : MashMap.INI[o].LV;
                if (v.icon == undefined && v.Maker) v.icon = MashMap._MakeIcon(v.Maker);
                v.Credit = "<img src='" + MashMap.URL + "/bunners/" + v.Bunner + "' alt='" + v.Name + "'/>";
                if (v.onLoad != undefined) v.onLoad();
            });
            MashMap.Show();
        }
        MashMap.Hide();
        MashMap._gmap = m;
        MashMap._SysLoad(v);
    },
    Show: function() {
        //描画開始
        //イベントハンドラ：地図移動時：各APIにクエリを送出
        MashMap._evnt = GEvent.addListener(MashMap._gmap, 'moveend', MashMap.Search);
        //カスタムマーカーマネージャ
        if (!MashMap._mmng) MashMap._mmng = new MarkerManager(MashMap._gmap);
        MashMap.Search();
    },
    Hide: function() {
        //描画停止、マーカー破棄
        if (MashMap._evnt) { GEvent.removeListener(MashMap._evnt); MashMap._evnt = null; }
        if (MashMap._mmng) { MashMap._mmng.clearMakers(); MashMap._mrks = new Array(); }
    },
    Search: function() {
        //検索実行
        var z = MashMap._gmap.getZoom();
        MashMap.APIs.each(function(v) { if (v.LV <= z && v.Query != undefined) v.Query(MashMap._gmap); });
    },
    Click: function(i) {
        //マーカークリック
        var s = MashMap._mrks[i].d;
        MashMap._mrks[i].m.openInfoWindowHtml(s);
    },
    Request: function(t, r, p, o) {
        var s = "";
        each(p, function(i) { s += (s == "" ? "?" : "&") + i + "=" + p[i] });
        s = r + s;
        switch (t) {
            case "xml":
                crossdomain.request(s, o);
                break;
            case "jsonp":
                Jsonp(s, o);
                break;
            case "json":
                //未対応
                break;
            default:
                break;
        }
    },
    AddItem: function(r, a) {
        if (MashMap._mrks[r.id] == undefined) {
            var mk = new GMarker(r.pos, a.icon);
            MashMap._mmng.addMarker(mk, a.LV);
            GEvent.addListener(mk, "click", GEvent.callbackArgs(mk, MashMap.Click, r.id));
            MashMap._mrks[r.id] = { m: mk, d: MashMap._AssignInfoWindow(r, a) };
        }
    },
    _MakeIcon: function(mk) {
        var i = new GIcon();
        i.image = MashMap.URL + "/icons/" + mk.image;
        i.iconSize = new GSize(mk.width, mk.height);
        i.iconAnchor = new GLatLng(mk.height, parseInt(mk.width / 2));
        i.infoWindowAnchor = new GLatLng(3, parseInt(mk.width / 2));
        return i;
    },
    _AssignInfoWindow: function(r, a) {
        var s = "";
        s += "<div class='mm_title'>";
        s += r.URL != "" && isURL(r.URL) ? "<a href='" + r.URL + "' target='_blank'>" + r.name + "</a>" : "<span>" + r.name + "</span>";
        s += "</div>";
        if (r.img != "") {
            s += "<div class='mm_img'>";
            if (r.URL != "" && isURL(r.URL)) s += "<a href='" + r.URL + "' target='_blank'>";
            s += "<div style='background-image:URL(" + r.img + ");'></div>";
            if (r.URL != "" && isURL(r.URL)) s += "</a>";
            s += "</div>";
        }
        s += "<div class='mm_desc' >" + r.desc + "</div>";
        s += "<div class='mm_cdt' >Powerd By <a href='" + a.URL + "' target='_blank'>" + a.Credit + "</a></div>";
        s = "<div class='" + (r.img != "" ? "mm_340" : "mm_250") + "'>" + s + "</div>";
        return s;
    },
    _SysLoad: function(f) {
        //スクリプトインクルード処理、クロスドメインツールの準備
        var j = "", s = document.getElementsByTagName("script");
        for (var i = 0; i < s.length; i++) if (s[i].src && s[i].src.match(/mashmap\.js/)) MashMap.URL = s[i].src.substring(0, s[i].src.lastIndexOf('/'));
        if (MashMap.INI == null) Include(MashMap.URL + "/manifest.js");
        Include(MashMap.URL + "/plugins.js");
        Include(MashMap.URL + "/libs/crossdomain.js");
        Include(MashMap.URL + "/libs/markermanager.js");
        IncludeCSS(MashMap.URL + "/css/mashmap.css");
        var l = function() {
            //ロードステータスを確認
            if (MashMap._gmap.isLoaded() &&
                window['MarkerManager'] &&
                MashMap.INI != null &&
                MM_PLUGINS_LOADED == 1 &&
                crossdomain.loaded == 1
            ) f(); else setTimeout(l, 100);
        }; l();
    }, APIs: new Array(), _APIList: new Array(), _gmap: null, _mmng: null, _mrks: new Array(), _evnt: null, URL: "", INI: null
}, MM_PLUGINS_LOADED = 0;

//Ken's common functions

//非同期でJavascriptを読み込む（ID指定可能）
//Jsonp通信に使用
function Jsonp(u, i) {
    if (i == undefined) i = "JsonCommonID";
    var h = document.getElementsByTagName('head')[0];
    if (document.getElementById(i) != null) {
        h.removeChild(document.getElementById(i));
    }
    var s = document.createElement('script');
    s.charset = 'utf-8';
    s.type = 'text/javascript';
    s.src = u;
    s.id = i;
    h.appendChild(s);
}
//非同期でJavascriptを読み込む
function Include(u) {
    var h = document.getElementsByTagName('head')[0];
    var s = document.createElement('script');
    s.charset = 'utf-8';
    s.type = 'text/javascript';
    s.src = u;
    h.appendChild(s);
}

//非同期でCssを読み込む
function IncludeCSS(u) {
    var h = document.getElementsByTagName('head')[0];
    var s = document.createElement('link');
    s.type = 'text/css';
    s.rel = "stylesheet";
    s.href = u;
    h.appendChild(s);
}

//Each 配列、オブジェクトループ処理を簡素化する。
Array.prototype.each = function(f) { for (var i = 0; i < this.length; i++) if (this[i] != undefined) f(this[i]); }
function each(o, f) { if (IsArray(o)) o.each(f); else for (var i in o) f(i); }
function IsArray(a) { return a.constructor === Array; }

//外部サイトのテキストを無害化（タグを無効に）
function strip_tags(s) { if (!s) return ""; return s.replace(/<\/?[^>]+>/gi, ""); }

//その他　座標、表記用
function mround(value) { return Math.round(parseFloat(value) * 1000000) / 1000000; }
function isURL(u) { return u.search(/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/) == 0; }
function Angle2Msec(v) { return Math.round(v * 60 * 60 * 1000); }
function Msec2Angle(v) { return v / 60 / 60 / 1000; }
function DateToStr(date) {
    var y = date.getFullYear(), m = date.getMonth() + 1, d = date.getDate();
    return y + "/" + (m < 10 ? "0" : "") + m + "/" + (d < 10 ? "0" : "") + d;
}
function jp2world(x, y) {
    x = parseFloat(x); y = parseFloat(y);
    return { lng: x - y * 0.000046038 - x * 0.000083043 + 0.010040, lat: y - y * 0.00010695 + x * 0.000017464 + 0.0046017 };
}
function world2jp(x, y) {
    x = parseFloat(x); y = parseFloat(y);
    return { lng: x + y * 0.000046047 + x * 0.000083049 - 0.010041, lat: y + y * 0.00010696 - x * 0.000017467 - 0.0046020 };
}



