panshi_vue_new/public/static/baidu/js/script/city.js

457 lines
14 KiB
JavaScript

var BMapLib = window.BMapLib = BMapLib || {};
(function() {
var baidu = baidu || {
guid : "$BAIDU$"
};
(function() {
window[baidu.guid] = {};
baidu.extend = function(target, source) {
for ( var p in source) {
if (source.hasOwnProperty(p)) {
target[p] = source[p];
}
}
return target;
};
baidu.lang = baidu.lang || {};
baidu.lang.guid = function() {
return "TANGRAM__" + (window[baidu.guid]._counter++).toString(36);
};
window[baidu.guid]._counter = window[baidu.guid]._counter || 1;
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
baidu.lang.Class = function(guid) {
this.guid = guid || baidu.lang.guid();
window[baidu.guid]._instances[this.guid] = this;
};
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
baidu.lang.isString = function(source) {
return "[object String]" == Object.prototype.toString.call(source);
};
baidu.lang.isFunction = function(source) {
return "[object Function]" == Object.prototype.toString
.call(source);
};
baidu.lang.Class.prototype.toString = function() {
return "[object " + (this._className || "Object") + "]";
};
baidu.lang.Event = function(type, target) {
this.type = type;
this.returnValue = true;
this.target = target || null;
this.currentTarget = null;
};
baidu.lang.Class.prototype.addEventListener = function(type, handler,
key) {
if (!baidu.lang.isFunction(handler)) {
return;
}
!this.__listeners && (this.__listeners = {});
var t = this.__listeners, id;
if (typeof key == "string" && key) {
if (/[^\w\-]/.test(key)) {
throw ("nonstandard key:" + key);
} else {
handler.hashCode = key;
id = key;
}
}
type.indexOf("on") != 0 && (type = "on" + type);
typeof t[type] != "object" && (t[type] = {});
id = id || baidu.lang.guid();
handler.hashCode = id;
t[type][id] = handler;
};
baidu.lang.Class.prototype.removeEventListener = function(type, handler) {
if (baidu.lang.isFunction(handler)) {
handler = handler.hashCode;
} else {
if (!baidu.lang.isString(handler)) {
return;
}
}
!this.__listeners && (this.__listeners = {});
type.indexOf("on") != 0 && (type = "on" + type);
var t = this.__listeners;
if (!t[type]) {
return;
}
t[type][handler] && delete t[type][handler];
};
baidu.lang.Class.prototype.dispatchEvent = function(event, options) {
if (baidu.lang.isString(event)) {
event = new baidu.lang.Event(event);
}
!this.__listeners && (this.__listeners = {});
options = options || {};
for ( var i in options) {
event[i] = options[i];
}
var i, t = this.__listeners, p = event.type;
event.target = event.target || this;
event.currentTarget = this;
p.indexOf("on") != 0 && (p = "on" + p);
baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);
if (typeof t[p] == "object") {
for (i in t[p]) {
t[p][i].apply(this, arguments);
}
}
return event.returnValue;
};
baidu.lang.inherits = function(subClass, superClass, className) {
var key, proto, selfProps = subClass.prototype, clazz = new Function();
clazz.prototype = superClass.prototype;
proto = subClass.prototype = new clazz();
for (key in selfProps) {
proto[key] = selfProps[key];
}
subClass.prototype.constructor = subClass;
subClass.superClass = superClass.prototype;
if ("string" == typeof className) {
proto._className = className;
}
;
};
baidu.dom = baidu.dom || {};
baidu.g = baidu.dom.g = function(id) {
if ("string" == typeof id || id instanceof String) {
return document.getElementById(id);
} else {
if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
return id;
}
}
return null;
};
baidu.browser = baidu.browser || {};
if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
baidu.browser.ie = baidu.ie = document.documentMode
|| +RegExp["\x241"];
}
baidu.dom._NAME_ATTRS = (function() {
var result = {
cellpadding : "cellPadding",
cellspacing : "cellSpacing",
colspan : "colSpan",
rowspan : "rowSpan",
valign : "vAlign",
usemap : "useMap",
frameborder : "frameBorder"
};
if (baidu.browser.ie < 8) {
result["for"] = "htmlFor";
result["class"] = "className";
} else {
result.htmlFor = "for";
result.className = "class";
}
return result;
})();
baidu.getAttr = baidu.dom.getAttr = function(element, key) {
element = baidu.dom.g(element);
if ("style" == key) {
return element.style.cssText;
}
key = baidu.dom._NAME_ATTRS[key] || key;
return element.getAttribute(key);
};
baidu.event = baidu.event || {};
baidu.event._listeners = baidu.event._listeners || [];
baidu.on = baidu.event.on = function(element, type, listener) {
type = type.replace(/^on/i, "");
element = baidu.g(element);
var realListener = function(ev) {
listener.call(element, ev);
}, lis = baidu.event._listeners, filter = baidu.event._eventFilter, afterFilter, realType = type;
type = type.toLowerCase();
if (filter && filter[type]) {
afterFilter = filter[type](element, type, realListener);
realType = afterFilter.type;
realListener = afterFilter.listener;
}
if (element.addEventListener) {
element.addEventListener(realType, realListener, false);
} else {
if (element.attachEvent) {
element.attachEvent("on" + realType, realListener);
}
}
lis[lis.length] = [ element, type, listener, realListener, realType ];
return element;
};
})();
BMapLib.COUNTRY_TYPE_CODE = 0;
BMapLib.PROVINCE_TYPE_CODE = 1;
BMapLib.CITY_TYPE_CODE = 2;
var CityList = BMapLib.CityList = function(opts) {
opts = opts || {};
this._opts = baidu.extend(baidu.extend(this._opts || {}, {
container : null,
map : null
}), opts);
this._data = null;
this._css = [
".bmaplib_cityList{color:#333;font:12px arial,sans-serif;padding-left:10px;}",
".bmaplib_cityList h4{font-size:12px;font-weight:normal;margin:0;}",
".bmaplib_cityList hr{height:1px;border-top:solid 1px #ccc; border-bottom:none;}",
".bmaplib_cityList form,.bmaplib_cityList dl{margin:0;}",
".bmaplib_cityList dd,.bmaplib_cityList h4,.bmaplib_cityList dt{padding: 2px 0; vertical-align: top;line-height: 150%;}",
".bmaplib_cityList dt{float:left;width:52px;}",
".bmaplib_cityList dd{margin-left:52px;}",
".bmaplib_cityList a{color:#0000CC;text-decoration:underline;outline:none;margin-right: 8px;}",
".bmaplib_cityList dt a{margin-right:0;}",
".bmaplib_cityListDescript{color:#999;}",
".bmaplib_cityList .black{color:#000;}",
".bmaplib_cityList form span{color:red;}" ];
this._getDataFromMapServer();
};
baidu.lang.inherits(CityList, baidu.lang.Class, "CityList");
var _citylistCount = 1;
var _outputData = null;
CityList.prototype._getDataFromMapServer = function() {
var me = this;
scriptRequest(
"http://api.map.baidu.com/library/CityList/1.2/src/data/CityData.js",
function() {
me._callback();
});
};
CityList.prototype._callback = function() {
if (BMapLib.CityList._cityData) {
this._data = BMapLib.CityList._cityData;
BMapLib.CityList._cityData = null;
_outputData = this._formatCityData(this._data);
this._renderHtml();
this._bind();
}
};
CityList.prototype._renderHtml = function() {
if (!this._opts.container || !baidu.g(this._opts.container)) {
return
}
this._execCss();
var htm = [], data = this._data, vds = "javascript:void(0)", newData = {};
htm.push("<div class='bmaplib_cityList' id='bmaplib_cityList_"
+ this.guid + "'><dl>");
if (data.municipalities && data.municipalities.length > 0) {
htm.push("<dt>\u76f4\u8f96\u5e02\uff1a</dt><dd>");
for ( var i = 0, n = data.municipalities.length; i < n; i++) {
var mu = data.municipalities[i];
htm.push("<a href='#vd#' code='" + _citylistCount + "'>" + mu.n
+ "</a>");
newData[_citylistCount] = {
g : mu.g,
t : BMapLib.CITY_TYPE_CODE,
n : mu.n
};
_citylistCount++;
}
htm.push("</dd>");
}
for ( var i = 0, n = data.provinces.length; i < n; i++) {
var pv = data.provinces[i];
htm.push("<dt><a href='#vd#' class='black' code='" + _citylistCount
+ "'>" + pv.n + "</a>\uff1a</dt><dd>");
newData[_citylistCount] = {
g : pv.g,
t : BMapLib.PROVINCE_TYPE_CODE,
n : pv.n
};
_citylistCount++;
for ( var j = 0, m = pv.cities.length; j < m; j++) {
htm.push("<a href='#vd#' code='" + _citylistCount + "'>"
+ pv.cities[j].n + "</a>");
newData[_citylistCount] = {
g : pv.cities[j].g,
t : BMapLib.CITY_TYPE_CODE,
n : pv.cities[j].n
};
_citylistCount++;
}
htm.push("</dd>");
}
if (data.other && data.other.length > 0) {
htm.push("<dt>\u5176\u4ed6\uff1a</dt><dd>");
for ( var i = 0, n = data.other.length; i < n; i++) {
var oth = data.other[i];
htm.push("<a href='#vd#' code='" + _citylistCount + "'>"
+ oth.n + "</a>");
newData[_citylistCount] = {
g : oth.g,
t : BMapLib.CITY_TYPE_CODE,
n : oth.n
};
_citylistCount++;
}
htm.push("</dd>");
}
htm.push("</dl></div>");
baidu.g(this._opts.container).innerHTML = htm.join("").replace(
/#vd#/ig, vds);
this._data = newData;
};
CityList.prototype._bind = function() {
if (!this._opts.container || !baidu.g(this._opts.container)
|| !baidu.g("bmaplib_cityList_" + this.guid)) {
return
}
var cl = baidu.g("bmaplib_cityList_" + this.guid);
var tags = cl.getElementsByTagName("a"), me = this;
for ( var i = 0, n = tags.length; i < n; i++) {
(function() {
var tg = tags[i];
if (!tg) {
return
}
baidu
.on(
tg,
"click",
function() {
if (!baidu.getAttr(tg, "code")) {
return
}
var event = new baidu.lang.Event(
"oncityclick"), code = baidu
.getAttr(tg, "code"), json = me._data[code];
if (!json) {
return
}
json = formatJson(json);
event.name = json.name;
event.center = json.center;
event.citytype = json.t;
var _zoom = json.zoom;
if (me._opts.map) {
var _map = me._opts.map;
_zoom = getBestLevel(_zoom, _map);
_map.centerAndZoom(json.center, _zoom);
}
event.zoom = _zoom;
me.dispatchEvent(event);
});
})();
}
};
CityList.prototype._execCss = function() {
if (!BMapLib.CityList._isStyleRender) {
var st = null;
if (baidu.g("_bmaplib_citylist_css")) {
baidu.g("_bmaplib_citylist_css").parentNode.removeChild(baidu
.g("_bmaplib_citylist_css"));
}
var st = document.createElement("STYLE");
st.type = "text/css";
st.id = "_bmaplib_citylist_css";
document.body.appendChild(st);
if (baidu.browser.ie > 0) {
st.styleSheet.cssText = this._css.join("");
} else {
st.appendChild(document.createTextNode(this._css.join("")));
}
BMapLib.CityList._isStyleRender = true;
}
};
CityList.prototype._formatCityData = function(cityData) {
var _dt = cityData, _newDt = {};
if (_dt.municipalities && _dt.municipalities.length > 0) {
_newDt.municipalities = [];
for ( var i = 0, n = _dt.municipalities.length; i < n; i++) {
_newDt.municipalities.push(formatJson(_dt.municipalities[i]));
}
}
if (_dt.provinces && _dt.provinces.length > 0) {
_newDt.provinces = [];
for ( var i = 0, n = _dt.provinces.length; i < n; i++) {
_newDt.provinces.push(formatJson(_dt.provinces[i]));
_newDt.provinces[i].cities = [];
for ( var j = 0, m = _dt.provinces[i].cities.length; j < m; j++) {
_newDt.provinces[i].cities
.push(formatJson(_dt.provinces[i].cities[j]));
}
}
}
if (_dt.other && _dt.other.length > 0) {
_newDt.other = [];
for ( var i = 0, n = _dt.other.length; i < n; i++) {
_newDt.other.push(formatJson(_dt.other[i]));
}
}
return _newDt;
};
CityList.prototype.getCityData = function() {
return (!!_outputData ? _outputData : false);
};
function formatJson(cityinfo) {
if (!cityinfo || !cityinfo.n || !cityinfo.g) {
return
}
var newInfo = {};
newInfo.name = cityinfo.n;
var dts = cityinfo.g.split("|"), dtsPts = dts[0].split(",");
newInfo.center = new BMap.Point(dtsPts[0], dtsPts[1]);
var _zoom = parseInt(dts[1], 10);
newInfo.zoom = _zoom;
if (!!cityinfo.t) {
newInfo.t = cityinfo.t;
}
return newInfo;
}
function scriptRequest(url, callback, charset) {
var isIe = /msie/i.test(window.navigator.userAgent);
var scriptId = "_script_bmaplib_citylist_";
if (baidu.g(scriptId)) {
var script = baidu.g(scriptId);
} else {
if (baidu.g(scriptId)) {
baidu.g(scriptId).parentNode.removeChild(baidu.g(scriptId));
}
var script = document.createElement("script");
if (charset != null) {
script.charset = charset;
}
script.setAttribute("id", scriptId);
script.setAttribute("type", "text/javascript");
document.body.appendChild(script);
}
var t = new Date();
if (url.indexOf("?") > -1) {
url += "&t=" + t.getTime();
} else {
url += "?t=" + t.getTime();
}
var _complete = function() {
if (!script.readyState || script.readyState == "loaded"
|| script.readyState == "complete") {
if (typeof (callback) == "function") {
try {
callback();
} catch (e) {
}
} else {
eval(callback);
}
}
};
if (isIe) {
script.onreadystatechange = _complete;
} else {
script.onload = _complete;
}
script.setAttribute("src", url);
}
function getBestLevel(level, map) {
if (map) {
var sz = map.getSize();
var ratio = Math.min(sz.width / 1100, sz.height / 660);
level = Math.round(level + (Math.log(ratio) / Math.log(2)));
}
if (level < 1) {
level = 1;
}
if (level > 18) {
level = 18;
}
return level;
}
})();