﻿var map, esoso;
function voidCreateMap() {
    map = new GMap2($("map"));
    map.getMapTypes().length = 0;

    var gm = new GTileLayer(new GCopyrightCollection(""), 5, 18); //谷歌平面地图图层
    gm.getTileUrl = function(tile, zoomlevel, x) {
        var url = G_NORMAL_MAP.getTileLayers()[0].getTileUrl(tile, zoomlevel, x);
        var bits = url.split("&");
        bits[0] = bits[0].replace(".google.com/mt?v=ap.86", ".google.cn/vt/lyrs=m@169&gl=cn");
        url = bits.join("&");
        return url;
    };

    var st = new GTileLayer(new GCopyrightCollection(""), 5, 18);  //谷歌卫星影像图层
    st.isPng = function() { return true; };
    st.getOpacity = function() { return 1.0; };
    st.getTileUrl = function(tile, zoomlevel) {
        var sateurl = G_SATELLITE_MAP.getTileLayers()[0].getTileUrl(tile, zoomlevel);
        sateurl = formatStUrl(sateurl);
        return sateurl;
    };
    function formatStUrl(url) {
        var xindex = url.indexOf("&x=");
        var endstr = url.substr(xindex);
        var xvalue = endstr.substring(3, endstr.indexOf("&", 3));
        var re = "^http://khm([0-9]+)";
        return ("http://mt%.google.cn/vt/lyrs=s@102&gl=cn&" + endstr).format("%", url.match(re)[1]);
    }

    var strem = new GTileLayer(new GCopyrightCollection(""), 5, 18); //谷歌卫星影像注记图层
    strem.getTileUrl = function(tile, zoomlevel, x) {
        var url = G_NORMAL_MAP.getTileLayers()[0].getTileUrl(tile, zoomlevel, x);
        var bits = url.split("&");
        bits[0] = bits[0].replace(".google.com/mt?v=ap.86", ".google.cn/vt/imgtp=png32&lyrs=h@169&gl=cn");
        url = bits.join("&");
        return url;
    }

    var rt = new GTileLayer(new GCopyrightCollection(""), 10, 18);
    rt.myBaseURL = _mRootPath + "WRTMS.aspx?";
    rt.getTileUrl = CustomGetTileUrl;
    rt.myFormat = "image/png";
    rt.myMercZoomLevel = 5;
    rt.myMapName = "map";
    if (Prototype.Browser.IE && g_fltIeVersion < 7) {
        rt.myTransparent = "FALSE";
    }

    var type = new GMapType([gm, rt], G_NORMAL_MAP.getProjection(), "平面地图", G_NORMAL_MAP);
    map.addMapType(type);
    map.setMapType(type);

    type = new GMapType([st, strem, rt], G_NORMAL_MAP.getProjection(), "卫星影像", G_NORMAL_MAP);
    map.addMapType(type);

    map.disableContinuousZoom();
    map.enableScrollWheelZoom();
    map.enableInfoWindow();

    var controls = [new GLargeMapControl(), new GMapTypeControl(), new GScaleControl()];
    esoso = new EwMapControl("esoso", map, controls);
    esoso.setLeftInRightOutZoom(true);
    esoso.setCenter(new GLatLng(39.902, 116.385), 10);
    GEvent.addDomListener(document, "keydown", doOnKeyDown);
    GEvent.addListener(map, "maptypechanged", doOnMapCreate);
       
    var point = new GLatLng(39.993584, 116.377568);
    var maker = createMarker2(point, "point", 0, 1, 1, "北京九州联宇信息技术有限公司", "朝阳区安翔北里甲11号北京创业大厦B座501", "010-64830430", "www.realtraffic.cn", "中国实时动态交通信息服务领航者");
    map.addOverlay(maker);
}

var srcMarker = null;
function createMarker2(point, type, index, pid, fid, name, addr, tel, url, desc) {
	var letter = String.fromCharCode("A".charCodeAt(0) + index - 1);
	var icon = new EwMapIcon();
	if(index<100)
	{
		icon.image = _mStaticPath + ((index == 0) ? "marker" : "marker" + index.toString().toFixed(2, "0", true)) + ".png";
	}
	else
	{
		icon.image = _mStaticPath + "marker" + String.fromCharCode(index-35) + ".png";
	}
	var marker = new GMarker(point, {icon : icon, draggable: false, clickable : true, title : name});

	var html = "<div style='font-size:12px;font-family:宋体'><b>" + name + "</b><br />" + addr + "<br />" + tel + "<br />";
	if (null != url && "" != url) {
		url = url.toLowerCase();
		url = (0 != url.indexOf("http://")) ? "http://" + url : url;
		html += "<a href='" + url + "' target='_blank'>" + url.replace(/^http:\/\//i, "").replace(/\/$/, "") + "</a><br />";
	}
	if (null != desc && "" != desc) {
		html += "<i>" + desc + "</i>";
	}
	html += "</div>";
		
	var infoTabs = [new GInfoWindowTab("属性", html)];

	GEvent.addListener(marker, "click", function() {
		if (srcMarker != marker || map.getInfoWindow().isHidden()) {
			marker.openInfoWindowTabsHtml(infoTabs);
		}

		srcMarker = marker;
	});

	return marker;
}

var g_iTimes = 0;
function getRTI(reload) {
    if (currentCityIndex == -1) return;

    var center = map.getCenter();
    var url = _mRootPath + "RtiLastPubDateTime.aspx?CENTER=" + center.lng() + "," + center.lat();
    GDownloadUrl(url, function(data, responseCode) {
        var nowyear = new Date().getFullYear();
        var dt1 = nowyear + "-" + data;
        var datetime = ($("lblPubTime").text) ? $("lblPubTime").text : $("lblPubTime").outerText;
        if (datetime != dt1) {
            $("lblPubTime").innerHTML = dt1;

            if (reload) {
                reloadRtMap("");
            }
        }
    });
}

function reloadRtMap(fc) {
    if (undefined == fc) {
        fc = "";
    }

    var div = map.getContainer().firstChild.firstChild.childNodes[1];
    var len = div.childNodes.length;
    div = div.childNodes[len - 1];
    var img;
    var src;
    for (var i = 0; i < div.childNodes.length; i++) {
        img = div.childNodes[i];

        if (img.src.indexOf("?") == -1) continue;

        src = img.src.replace(/&rnd=.+/i, "");
        src = src.replace(/WRTMS\.aspx\?fc=fc;[0-9]+&/i, "WRTMS.aspx?&"); //去除旧的路况预测参数
        src = src.replace(/WRTMS\.aspx\?fc=wk;[0-9];[0-9]+;[0-9]&/i, "WRTMS.aspx?&"); //去除旧的周期路况参数
        if ("" != fc) {	//添加新的路况预测参数
            src = src.replace("WRTMS.aspx?&", "WRTMS.aspx?" + fc + "&");
        }

        img.src = src + "&rnd=" + "".passwd(6, 2);
        img.onload = function() {	//载入完成时重新显示路况图片
            this.style.display = "";
        }
    }
}

function doOnKeyDown(evt) {
    if (null == evt) {
        evt = window.event;
    }

    var src = (evt.srcElement) ? evt.srcElement : evt.target;
    switch (src.tagName.toLowerCase()) {
        case "input":
            return;
        case "texterea":
            return;
        default:
            break;
    }

    var code = evt.keyCode;
    var max = MAX_ZOOM_LEVEL;
    var min = MIN_ZOOM_LEVEL;
    var level;
    switch (code) {
        case 33: //right-up
        case 105:
            map.panDirection(-1, 1);
            break;
        case 34: //right-down
        case 99:
            map.panDirection(-1, -1);
            break;
        case 35: //left-down
        case 97:
            map.panDirection(1, -1);
            break;
        case 36: //left-up
        case 103:
            map.panDirection(1, 1);
            break;
        case 37: //left
        case 100:
            map.panDirection(2, 0);
            break;
        case 38: //up
        case 104:
            map.panDirection(0, 2);
            break;
        case 39: //right
        case 102:
            map.panDirection(-2, 0);
            break;
        case 40: //down
        case 98:
            map.panDirection(0, -2);
            break;
        case 12: //center
        case 101:
        case 107: //zoomin
            level = map.getZoom() + 1;
            level = (level > max) ? max : level;
            map.setCenter(map.getCenter(), level);
            break;
        case 109: //zoomout
            level = map.getZoom() - 1;
            level = (level < min) ? min : level;
            map.setCenter(map.getCenter(), level);
        default:
            break;
    }

    return false;
}

var g_tmGetRTI = null;
function doSetTimerGetRTI() {
    if (window.g_tmGetRTI) {
        window.clearInterval(g_tmGetRTI);
    }

    g_tmGetRTI = window.setInterval("getRTI(true);", 40000, "JavaScript");
}

function doOnMapUpdate() {
    getRTI(false);
    doSetTimerGetRTI();
}

var g_fltIeVersion = checkIeVersion();
function checkIeVersion() {
    if (navigator.appName == "Microsoft Internet Explorer") {
        ver = navigator.appVersion;

        if (ver.indexOf("MSIE 4") != -1) {
            return 4;
        }
        else if (ver.indexOf("MSIE 5") != -1) {
            if (ver.indexOf("MSIE 5.5") != -1) {
                return 5.5;
            }
            else {
                return 5;
            }
        }
        else {
            var re = /MSIE \b(\d\.*\d*);/gi;
            var ary = re.exec(ver);

            return parseFloat(RegExp.$1);
        }
    }

    else return 3;
}

function doOnMapCreate() {
    if (Prototype.Browser.IE && g_fltIeVersion < 7) {
        var div = map.getContainer().firstChild.firstChild.childNodes[1];
        var len = div.childNodes.length;
        var img;
        if (2 < len) {
            for (var i = 0; i < div.childNodes[1].childNodes.length; i++) {
                img = div.childNodes[1].childNodes[i];
                img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.Chroma(color='#D8E9EC')";
            }
        }

        div = div.childNodes[len - 1];
        for (var i = 0; i < div.childNodes.length; i++) {
            img = div.childNodes[i];
            img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.Chroma(color='#FFFFFF')";
        }
    }
}

function setMapCenter(sel) {
    var idx = sel.selectedIndex;
    var latlng = cityCenterPointAry[idx];
    var level = cityLevelAry[idx];
    map.setCenter(latlng, level);
    getRTI(false);
}

function doOnPageLoad() {
    voidDoOnResize();
    voidCreateMap();
    doOnMapCreate();
    doOnMapUpdate();
    doInitCityList();
}

var origCity = "北京";
var currentCityIndex = 0;
var cityBoundAry;
var cityCenterPointAry;
var cityLevelAry;
var cityIdAry;

function doInitCityList() {
    var url = _mRootPath + "JzxRtiCitys.aspx";
    GDownloadUrl(url, function(data, responseCode) {
        if (data != "" && data != undefined && data.length > 0) {

            cityCenterPointAry = [];
            cityLevelAry = [];
            cityBoundAry = [];
            cityIdAry = [];

            var x1, y1, x2, y2;
            var html = [];
            html.push("<select id=\"selCity\" onchange=\"setMapCenter(this);\">");
            var dataary = data.split(';');
            for (var i = 0; i < dataary.length; i++) {
                var itemary = dataary[i].split(',');
                html.push("<option");
                if (origCity == itemary[1]) {
                    html.push(" selected=\"selected\"");
                    currentCityIndex = i;
                }
                html.push(">");
                html.push(itemary[1]);
                html.push("</option>");

                cityIdAry.push(itemary[0]);

                x1 = parseFloat(itemary[2]);
                y1 = parseFloat(itemary[3]);
                x2 = parseFloat(itemary[4]);
                y2 = parseFloat(itemary[5]);

                var centerX = (x1 + x2) / 2;
                var centerY = (y1 + y2) / 2;

                if (itemary.length > 6 && itemary[6]) {
                    centerX = parseFloat(itemary[6]);
                }
                if (itemary.length > 7 && itemary[7]) {
                    centerY = parseFloat(itemary[7]);
                }

                var level = 10;
                if (itemary.length > 8 && itemary[8]) {
                    level = parseInt(itemary[8]);
                }

                cityCenterPointAry.push(new GLatLng(centerY, centerX));
                cityLevelAry.push(level);

                var sw = new GLatLng(y1, x1);
                var ne = new GLatLng(y2, x2);
                var gbound = new GLatLngBounds(sw, ne);
                cityBoundAry.push(gbound);
            }
            html.push("</select>");
            $("tdCityList").innerHTML = html.join("");
        }
    });
    GEvent.addListener(map, "moveend", checkCityBound);
}

function checkCityBound() {
    var center = map.getCenter();
    var bound;

    if (currentCityIndex != -1) {
        bound = cityBoundAry[currentCityIndex];
        if (bound.containsLatLng(center)) return;
    }

    var bfind = false;
    for (var i = 0; i < cityBoundAry.length; i++) {
        bound = cityBoundAry[i];
        if (bound.containsLatLng(center)) {
            bfind = true;
            currentCityIndex = i;
            $("selCity").selectedIndex = i;
            getRTI(false);
            break;
        }
    }
    if (!bfind) {
        currentCityIndex = -1;
        $("selCity").selectedIndex = -1;
        $("lblPubTime").innerHTML = "无";
    }
}

var g_iMinMapHeight = 200;
function voidDoOnResize() {
    $("map").style.width = "100%";

    var w = $("map").offsetWidth;

    var h;
    if (window.innerHeight) {
        h = window.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
        h = document.documentElement.clientHeight;
    }

    if (h < g_iMinMapHeight) {
        h = g_iMinMapHeight;
    }

    h = h - $("logo").offsetHeight - 8;
    $("map").style.height = h + "px";
    $("divSrchRst").style.height = (h - 90) + "px";

    if (esoso) {
        esoso.resizeTo(w, h);
    }
}

function strEwWebRoot() {
    return "http://www.realtimetraffic.cn/";
}

function strGetXml(city, key, blike) {
    var strXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    strXML += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    strXML += "<soap:Body>";
    strXML += "<SearchRoad xmlns=\"" + strEwWebRoot() + "\">";
    strXML += "<city>" + city + "</city>";
    strXML += "<key>" + key + "</key>";
    strXML += "<bLike>" + (blike ? 1 : 0) + "</bLike>";
    strXML += "</SearchRoad>";
    strXML += "</soap:Body>";
    strXML += "</soap:Envelope>";
    return strXML;
}

function rtiSearch(objForm) {
    if (currentCityIndex == -1) {
        alert("请设置要查询路况的城市！");
        return false;
    }
    var city = cityIdAry[currentCityIndex];
    var strKey = objForm.txtSearchKey.value;
    var blike = objForm.ckbBLike.checked;
    if (!isEmpty(strKey)) {
        strKey = strKey.trim().XMLEncode().numSbc2Dbc();
        if (!isEmpty(strKey)) {
            voidDoNorSrch(strKey, blike, city);
        }
    }
    else {
        alert("请输入道路名称！");
    }
    return false;
}

function voidDoNorSrch(strKey, bLike, city) {
    var strUrl = _mRootPath + "RoadSearch.asmx";
    var strBody = strGetXml(city, strKey, bLike);
    var aryOptions = { method: "post", contentType: "text/xml; charset=utf-8", encoding: "utf-8", postBody: strBody, requestHeaders: ["SOAPAction", strEwWebRoot() + "SearchRoad", "Content-Length", "Content-Length", strBody.length], onComplete: voidOnSrchEnd };
    var objAjax = new Ajax.Request(strUrl, aryOptions);
    $("divSrchRst").innerHTML = "正在查询...";
    $("btnSearch").disabled = true;
}

function FormatXml(xmlStr) {
    return GXml.parse(xmlStr);
}

//var fields = "FID,道路ID,长度,名称,等级,路况";
var headhtml = "<tr><th align=\"left\">道路编号</th><th align=\"left\">名称</th><th align=\"right\">长度(m)</th><th>路况</th></tr>";
var rowhtml = "<tr class=\"rstrow\" onclick=\"locatorMap(%);\"><td>%</td><td>%</td><td align=\"right\">%</td><td align=\"center\">%</td></tr>";
var pagehtml = "<div class=\"rstpage\"><span>当前第%页/总%页</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"javascript:prePage();\">上一页</a>&nbsp;&nbsp;<a href=\"javascript:nextPage();\">下一页</a></div>";
var roadPropAry;
var pageSize = 20;
var currentPageIndex = 0;

function voidOnSrchEnd(objRequest) {
    var objXmlDoc = FormatXml(objRequest.responseText.replace("<SearchRoadResponse xmlns=\"" + strEwWebRoot() + "\">", "<SearchRoadResponse>")); //TODO:firefox中xpath处理非标准namespace时有问题，暂时替换掉

    var objNodeResponse = objXmlDoc.documentElement.selectSingleNode("soap:Body").firstChild;
    var objNodeRst = objNodeResponse.selectSingleNode("SearchRoadResult");
    var objNodeState = objNodeResponse.selectSingleNode("state");
    var rstText = objNodeRst.text;
    switch (objNodeState.text) {
        case "NoData":
            $("divSrchRst").innerHTML = "未找到满足条件的道路。";
            break;
        case "Successful":
            if (rstText == "") {
                $("divSrchRst").innerHTML = "未找到满足条件的道路。";
            }
            else {
                var rstLines = rstText.split('|');

                roadPropAry = [rstLines.length];
                for (var i = 0; i < rstLines.length; i++) {
                    var line = rstLines[i].split(';');
                    roadPropAry[i] = line;
                }
                currentPageIndex = 0;
                bindPage();
            }
            break;
        default:
            $("divSrchRst").innerHTML = rstText;
            break;
    }
    $("btnSearch").disabled = false;
}

function bindPage() {
    var pageCount = Math.floor(roadPropAry.length / pageSize);
    pageCount = (roadPropAry.length % pageSize == 0) ? pageCount : pageCount + 1;

    if (currentPageIndex < 0) currentPageIndex = 0;
    if (currentPageIndex >= pageCount) currentPageIndex = pageCount - 1;

    var start = currentPageIndex * pageSize;
    var end = (currentPageIndex + 1) * pageSize;

    start = (start < 0) ? 0 : start;
    end = (end >= roadPropAry.length) ? roadPropAry.length - 1 : end;

    var html = [];
    html.push("共找到%条路段。".format("%", roadPropAry.length));
    html.push("<table class=\"tabRoadList\" width=\"100%\">");
    html.push(headhtml);
    for (var i = start; i < end; i++) {
        var line = roadPropAry[i];
        html.push(rowhtml.format("%", i, line[1], line[3], line[2], formatRoadStatus(line[5])));
    }
    html.push("</table>");
    if (pageCount > 0) {
        html.push(pagehtml.format("%", (currentPageIndex + 1), pageCount));
    }
    $("divSrchRst").innerHTML = html.join("");
}
function prePage() {
    currentPageIndex--;
    bindPage();
}
function nextPage() {
    currentPageIndex++;
    bindPage();
}
function locatorMap(idx) {
    var line = roadPropAry[idx];
    var pointstr = line[line.length - 1];
    var coordary = pointstr.split(',');

    var linepoints = [Math.floor(coordary.length / 2)];
    for (var i = 0; i < coordary.length; i += 2) {
        linepoints[i / 2] = new GLatLng(parseFloat(coordary[i + 1]), parseFloat(coordary[i]));
    }
    map.clearOverlays();

    var polygon = new GPolyline(linepoints, "#00EDFD", 5, 1, { clickable: false, geodesic: false });
    if (map.getZoom() < 15) {
        var bound = polygon.getBounds();
        map.setCenter(bound.getCenter(), 16);
    }
    map.addOverlay(polygon);

    var mapbound = map.getBounds();
    for (var i = 0; i < linepoints.length; i++) {
        var latlng = linepoints[i];
        if (!mapbound.containsLatLng(latlng)) {
            map.panTo(latlng);
            break;
        }
    }
}
function formatRoadStatus(text) {
    return text;
}
