(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.BMapLib = global.BMapLib || {}, global.BMapLib.MarkerClusterer = factory());
}(this, (function () { 'use strict';

var __commonjs_global = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : this;
function __commonjs(fn, module) { return module = { exports: {} }, fn(module, module.exports, __commonjs_global), module.exports; }


var index$1 = __commonjs(function (module, exports, global) {
(function (root, factory) {  
    if (typeof exports === 'object') {  
        module.exports = factory();
    } else if (typeof define === 'function' && define.amd) {  
        define(factory);  
    } else {
        root.BMapLib = root.BMapLib || {};
        root.BMapLib.TextIconOverlay = root.BMapLib.TextIconOverlay || factory();  
    }  
})(__commonjs_global, function() {
    var T,
    baidu = T = baidu || {version: "1.3.8"}; 
    var context = {};
    //鎻愬嚭guid锛岄槻姝㈠湪涓庤€佺増鏈琓angram娣风敤鏃�
    //鍦ㄤ笅涓€琛岄敊璇殑淇敼context[undefined]
    baidu.guid = "$BAIDU$";

    //Tangram鍙兘琚斁鍦ㄩ棴鍖呬腑
    //涓€浜涢〉闈㈢骇鍒敮涓€鐨勫睘鎬э紝闇€瑕佹寕杞藉湪context[baidu.guid]涓�
    context[baidu.guid] = context[baidu.guid] || {};

    /**         
    * @ignore
    * @namespace baidu.dom 鎿嶄綔dom鐨勬柟娉曘€�
    */
    baidu.dom = baidu.dom || {};

    
    /**
     * 浠庢枃妗d腑鑾峰彇鎸囧畾鐨凞OM鍏冪礌
     * @name baidu.dom.g
     * @function
     * @grammar baidu.dom.g(id)
     * @param {string|HTMLElement} id 鍏冪礌鐨刬d鎴朌OM鍏冪礌
     * @shortcut g,T.G
     * @meta standard
     * @see baidu.dom.q
     *             
     * @returns {HTMLElement|null} 鑾峰彇鐨勫厓绱狅紝鏌ユ壘涓嶅埌鏃惰繑鍥瀗ull,濡傛灉鍙傛暟涓嶅悎娉曪紝鐩存帴杩斿洖鍙傛暟
     */
    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.g = baidu.G = baidu.dom.g;

    /**
     * 鑾峰彇鐩爣鍏冪礌鎵€灞炵殑document瀵硅薄
     * @name baidu.dom.getDocument
     * @function
     * @grammar baidu.dom.getDocument(element)
     * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id
     * @meta standard
     * @see baidu.dom.getWindow
     *             
     * @returns {HTMLDocument} 鐩爣鍏冪礌鎵€灞炵殑document瀵硅薄
     */
    baidu.dom.getDocument = function (element) {
        element = baidu.dom.g(element);
        return element.nodeType == 9 ? element : element.ownerDocument || element.document;
    };

    /**
         * @ignore
     * @namespace baidu.lang 瀵硅瑷€灞傞潰鐨勫皝瑁咃紝鍖呮嫭绫诲瀷鍒ゆ柇銆佹ā鍧楁墿灞曘€佺户鎵垮熀绫讳互鍙婂璞¤嚜瀹氫箟浜嬩欢鐨勬敮鎸併€�
    */
    baidu.lang = baidu.lang || {};

    /**
     * 鍒ゆ柇鐩爣鍙傛暟鏄惁string绫诲瀷鎴朣tring瀵硅薄
     * @name baidu.lang.isString
     * @function
     * @grammar baidu.lang.isString(source)
     * @param {Any} source 鐩爣鍙傛暟
     * @shortcut isString
     * @meta standard
     * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
     *             
     * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉
     */
    baidu.lang.isString = function (source) {
        return '[object String]' == Object.prototype.toString.call(source);
    };

    // 澹版槑蹇嵎鏂规硶
    baidu.isString = baidu.lang.isString;

    /**
     * 浠庢枃妗d腑鑾峰彇鎸囧畾鐨凞OM鍏冪礌
     * **鍐呴儴鏂规硶**
     * 
     * @param {string|HTMLElement} id 鍏冪礌鐨刬d鎴朌OM鍏冪礌
     * @meta standard
     * @return {HTMLElement} DOM鍏冪礌锛屽鏋滀笉瀛樺湪锛岃繑鍥瀗ull锛屽鏋滃弬鏁颁笉鍚堟硶锛岀洿鎺ヨ繑鍥炲弬鏁�
     */
    baidu.dom._g = function (id) {
        if (baidu.lang.isString(id)) {
            return document.getElementById(id);
        }
        return id;
    };

    // 澹版槑蹇嵎鏂规硶
    baidu._g = baidu.dom._g;

    /**
     * @ignore
     * @namespace baidu.browser 鍒ゆ柇娴忚鍣ㄧ被鍨嬪拰鐗规€х殑灞炴€с€�
     */
    baidu.browser = baidu.browser || {};

    if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
        //IE 8涓嬶紝浠ocumentMode涓哄噯
        //鍦ㄧ櫨搴︽ā鏉夸腑锛屽彲鑳戒細鏈�$锛岄槻姝㈠啿绐侊紝灏�$1 鍐欐垚 \x241
        /**
         * 鍒ゆ柇鏄惁涓篿e娴忚鍣�
         * @property ie ie鐗堟湰鍙�
         * @grammar baidu.browser.ie
         * @meta standard
         * @shortcut ie
         * @see baidu.browser.firefox,baidu.browser.safari,baidu.browser.opera,baidu.browser.chrome,baidu.browser.maxthon 
         */
        baidu.browser.ie = baidu.ie = document.documentMode || + RegExp['\x241'];
    }

    /**
     * 鑾峰彇鐩爣鍏冪礌鐨刢omputed style鍊笺€傚鏋滃厓绱犵殑鏍峰紡鍊间笉鑳借娴忚鍣ㄨ绠楋紝鍒欎細杩斿洖绌哄瓧绗︿覆锛圛E锛�
     *
     * @author berg
     * @name baidu.dom.getComputedStyle
     * @function
     * @grammar baidu.dom.getComputedStyle(element, key)
     * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id
     * @param {string} key 瑕佽幏鍙栫殑鏍峰紡鍚�
     *
     * @see baidu.dom.getStyle
     *             
     * @returns {string} 鐩爣鍏冪礌鐨刢omputed style鍊�
     */

    baidu.dom.getComputedStyle = function(element, key){
        element = baidu.dom._g(element);
        var doc = baidu.dom.getDocument(element),
            styles;
        if (doc.defaultView && doc.defaultView.getComputedStyle) {
            styles = doc.defaultView.getComputedStyle(element, null);
            if (styles) {
                return styles[key] || styles.getPropertyValue(key);
            }
        }
        return ''; 
    };

    /**
     * 鎻愪緵缁檚etStyle涓巊etStyle浣跨敤
     */
    baidu.dom._styleFixer = baidu.dom._styleFixer || {};

    /**
     * 鎻愪緵缁檚etStyle涓巊etStyle浣跨敤
     */
    baidu.dom._styleFilter = baidu.dom._styleFilter || [];

    /**
     * 涓鸿幏鍙栧拰璁剧疆鏍峰紡鐨勮繃婊ゅ櫒
     * @private
     * @meta standard
     */
    baidu.dom._styleFilter.filter = function (key, value, method) {
        for (var i = 0, filters = baidu.dom._styleFilter, filter; filter = filters[i]; i++) {
            if (filter = filter[method]) {
                value = filter(key, value);
            }
        }
        return value;
    };

    /**
         * @ignore
     * @namespace baidu.string 鎿嶄綔瀛楃涓茬殑鏂规硶銆�
     */
    baidu.string = baidu.string || {};

    /**
     * 灏嗙洰鏍囧瓧绗︿覆杩涜椹煎嘲鍖栧鐞�
     * @name baidu.string.toCamelCase
     * @function
     * @grammar baidu.string.toCamelCase(source)
     * @param {string} source 鐩爣瀛楃涓�
     * @remark
     * 鏀寔鍗曡瘝浠モ€�-_鈥濆垎闅�
     * @meta standard
     *             
     * @returns {string} 椹煎嘲鍖栧鐞嗗悗鐨勫瓧绗︿覆
     */
    baidu.string.toCamelCase = function (source) {
        //鎻愬墠鍒ゆ柇锛屾彁楂榞etStyle绛夌殑鏁堢巼 thanks xianwei
        if (source.indexOf('-') < 0 && source.indexOf('_') < 0) {
            return source;
        }
        return source.replace(/[-_][^-_]/g, function (match) {
            return match.charAt(1).toUpperCase();
        });
    };

    /**
     * 鑾峰彇鐩爣鍏冪礌鐨勬牱寮忓€�
     * @name baidu.dom.getStyle
     * @function
     * @grammar baidu.dom.getStyle(element, key)
     * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id
     * @param {string} key 瑕佽幏鍙栫殑鏍峰紡鍚�
     * @remark
     * 
     * 涓轰簡绮剧畝浠g爜锛屾湰妯″潡榛樿涓嶅浠讳綍娴忚鍣ㄨ繑鍥炲€艰繘琛屽綊涓€鍖栧鐞嗭紙濡備娇鐢╣etStyle鏃讹紝涓嶅悓娴忚鍣ㄤ笅鍙兘杩斿洖rgb棰滆壊鎴杊ex棰滆壊锛夛紝涔熶笉浼氫慨澶嶆祻瑙堝櫒鐨刡ug鍜屽樊寮傛€э紙濡傝缃甀E鐨刦loat灞炴€у彨styleFloat锛宖irefox鍒欐槸cssFloat锛夈€�<br />
     * baidu.dom._styleFixer鍜宐aidu.dom._styleFilter鍙互涓烘湰妯″潡鎻愪緵鏀寔銆�<br />
     * 鍏朵腑_styleFilter鑳藉棰滆壊鍜宲x杩涜褰掍竴鍖栧鐞嗭紝_styleFixer鑳藉display锛宖loat锛宱pacity锛宼extOverflow鐨勬祻瑙堝櫒鍏煎鎬ug杩涜澶勭悊銆�	
     * @shortcut getStyle
     * @meta standard
     * @see baidu.dom.setStyle,baidu.dom.setStyles, baidu.dom.getComputedStyle
     *             
     * @returns {string} 鐩爣鍏冪礌鐨勬牱寮忓€�
     */
    baidu.dom.getStyle = function (element, key) {
        var dom = baidu.dom;

        element = dom.g(element);
        key = baidu.string.toCamelCase(key);
        //computed style, then cascaded style, then explicitly set style.
        var value = element.style[key] ||
                    (element.currentStyle ? element.currentStyle[key] : "") || 
                    dom.getComputedStyle(element, key);

        // 鍦ㄥ彇涓嶅埌鍊肩殑鏃跺€欙紝鐢╢ixer杩涜淇
        if (!value) {
            var fixer = dom._styleFixer[key];
            if(fixer){
                value = fixer.get ? fixer.get(element) : baidu.dom.getStyle(element, fixer);
            }
        }

        /* 妫€鏌ョ粨鏋滆繃婊ゅ櫒 */
        if (fixer = dom._styleFilter) {
            value = fixer.filter(key, value, 'get');
        }

        return value;
    };

    // 澹版槑蹇嵎鏂规硶
    baidu.getStyle = baidu.dom.getStyle;


    if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) {
    /**
     * 鍒ゆ柇鏄惁涓簅pera娴忚鍣�
     * @property opera opera鐗堟湰鍙�
     * @grammar baidu.browser.opera
     * @meta standard
     * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome 
     */
        baidu.browser.opera = + RegExp['\x241'];
    }

    /**
     * 鍒ゆ柇鏄惁涓簑ebkit鍐呮牳
     * @property isWebkit 
     * @grammar baidu.browser.isWebkit
     * @meta standard
     * @see baidu.browser.isGecko
     */
    baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);

    /**
     * 鍒ゆ柇鏄惁涓篻ecko鍐呮牳
     * @property isGecko 
     * @grammar baidu.browser.isGecko
     * @meta standard
     * @see baidu.browser.isWebkit
     */
    baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);

    /**
     * 鍒ゆ柇鏄惁涓ユ牸鏍囧噯鐨勬覆鏌撴ā寮�
     * @property isStrict 
     * @grammar baidu.browser.isStrict
     * @meta standard
     */
    baidu.browser.isStrict = document.compatMode == "CSS1Compat";

    /**
     * 鑾峰彇鐩爣鍏冪礌鐩稿浜庢暣涓枃妗e乏涓婅鐨勪綅缃�
     * @name baidu.dom.getPosition
     * @function
     * @grammar baidu.dom.getPosition(element)
     * @param {HTMLElement|string} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱犵殑id
     * @meta standard
     *             
     * @returns {Object} 鐩爣鍏冪礌鐨勪綅缃紝閿€间负top鍜宭eft鐨凮bject銆�
     */
    baidu.dom.getPosition = function (element) {
        element = baidu.dom.g(element);
        var doc = baidu.dom.getDocument(element), 
            browser = baidu.browser,
            getStyle = baidu.dom.getStyle,
        // Gecko 1.9鐗堟湰浠ヤ笅鐢╣etBoxObjectFor璁$畻浣嶇疆
        // 浣嗘槸鏌愪簺鎯呭喌涓嬫槸鏈塨ug鐨�
        // 瀵逛簬杩欎簺鏈塨ug鐨勬儏鍐�
        // 浣跨敤閫掑綊鏌ユ壘鐨勬柟寮�
            BUGGY_GECKO_BOX_OBJECT = browser.isGecko > 0 && 
                                        doc.getBoxObjectFor &&
                                        getStyle(element, 'position') == 'absolute' &&
                                        (element.style.top === '' || element.style.left === ''),
            pos = {"left":0,"top":0},
            viewport = (browser.ie && !browser.isStrict) ? doc.body : doc.documentElement,
            parent,
            box;

        if(element == viewport){
            return pos;
        }

        if(element.getBoundingClientRect){ // IE and Gecko 1.9+
    
            //褰揌TML鎴栬€匓ODY鏈塨order width鏃�, 鍘熺敓鐨刧etBoundingClientRect杩斿洖鍊兼槸涓嶇鍚堥鏈熺殑
            //鑰冭檻鍒伴€氬父鎯呭喌涓� HTML鍜孊ODY鐨刡order鍙細璁炬垚0px,鎵€浠ュ拷鐣ヨ闂.
            box = element.getBoundingClientRect();

            pos.left = Math.floor(box.left) + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);
            pos.top  = Math.floor(box.top)  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop);
    
            // IE浼氱粰HTML鍏冪礌娣诲姞涓€涓猙order锛岄粯璁ゆ槸medium锛�2px锛�
            // 浣嗘槸鍦↖E 6 7 鐨勬€紓妯″紡涓嬶紝鍙互琚玥tml { border: 0; } 杩欐潯css瑙勫垯瑕嗙洊
            // 鍦↖E7鐨勬爣鍑嗘ā寮忎笅锛宐order姘歌繙鏄�2px锛岃繖涓€奸€氳繃clientLeft 鍜� clientTop鍙栧緱
            // 浣嗘槸銆傘€傘€傚湪IE 6 7鐨勬€紓妯″紡锛屽鏋滅敤鎴蜂娇鐢╟ss瑕嗙洊浜嗛粯璁ょ殑medium
            // clientTop鍜宑lientLeft涓嶄細鏇存柊
            pos.left -= doc.documentElement.clientLeft;
            pos.top  -= doc.documentElement.clientTop;
    
            var htmlDom = doc.body,
                // 鍦ㄨ繖閲岋紝涓嶄娇鐢╡lement.style.borderLeftWidth锛屽彧鏈塩omputedStyle鏄彲淇$殑
                htmlBorderLeftWidth = parseInt(getStyle(htmlDom, 'borderLeftWidth')),
                htmlBorderTopWidth = parseInt(getStyle(htmlDom, 'borderTopWidth'));
            if(browser.ie && !browser.isStrict){
                pos.left -= isNaN(htmlBorderLeftWidth) ? 2 : htmlBorderLeftWidth;
                pos.top  -= isNaN(htmlBorderTopWidth) ? 2 : htmlBorderTopWidth;
            }
        } else { 
            // safari/opera/firefox
            parent = element;

            do {
                pos.left += parent.offsetLeft;
                pos.top  += parent.offsetTop;
    
                // safari閲岄潰锛屽鏋滈亶鍘嗗埌浜嗕竴涓猣ixed鐨勫厓绱狅紝鍚庨潰鐨刼ffset閮戒笉鍑嗕簡
                if (browser.isWebkit > 0 && getStyle(parent, 'position') == 'fixed') {
                    pos.left += doc.body.scrollLeft;
                    pos.top  += doc.body.scrollTop;
                    break;
                }
        
                parent = parent.offsetParent;
            } while (parent && parent != element);

            // 瀵筨ody offsetTop鐨勪慨姝�
            if(browser.opera > 0 || (browser.isWebkit > 0 && getStyle(element, 'position') == 'absolute')){
                pos.top  -= doc.body.offsetTop;
            }

            // 璁$畻闄や簡body鐨剆croll
            parent = element.offsetParent;
            while (parent && parent != doc.body) {
                pos.left -= parent.scrollLeft;
                // see https://bugs.opera.com/show_bug.cgi?id=249965
                if (!browser.opera || parent.tagName != 'TR') {
                    pos.top -= parent.scrollTop;
                }
                parent = parent.offsetParent;
            }
        }

        return pos;
    };

    /**
     * @ignore
     * @namespace baidu.event 灞忚斀娴忚鍣ㄥ樊寮傛€х殑浜嬩欢灏佽銆�
     * @property target 	浜嬩欢鐨勮Е鍙戝厓绱�
     * @property pageX 		榧犳爣浜嬩欢鐨勯紶鏍噚鍧愭爣
     * @property pageY 		榧犳爣浜嬩欢鐨勯紶鏍噛鍧愭爣
     * @property keyCode 	閿洏浜嬩欢鐨勯敭鍊�
     */
    baidu.event = baidu.event || {};

    /**
     * 浜嬩欢鐩戝惉鍣ㄧ殑瀛樺偍琛�
     * @private
     * @meta standard
     */
    baidu.event._listeners = baidu.event._listeners || [];

    /**
     * 涓虹洰鏍囧厓绱犳坊鍔犱簨浠剁洃鍚櫒
     * @name baidu.event.on
     * @function
     * @grammar baidu.event.on(element, type, listener)
     * @param {HTMLElement|string|window} element 鐩爣鍏冪礌鎴栫洰鏍囧厓绱爄d
     * @param {string} type 浜嬩欢绫诲瀷
     * @param {Function} listener 闇€瑕佹坊鍔犵殑鐩戝惉鍣�
     * @remark
     * 
    1. 涓嶆敮鎸佽法娴忚鍣ㄧ殑榧犳爣婊氳疆浜嬩欢鐩戝惉鍣ㄦ坊鍔�<br>
    2. 鏀规柟娉曚笉涓虹洃鍚櫒鐏屽叆浜嬩欢瀵硅薄锛屼互闃叉璺╥frame浜嬩欢鎸傝浇鐨勪簨浠跺璞¤幏鍙栧け璐�

        * @shortcut on
        * @meta standard
        * @see baidu.event.un
        *             
        * @returns {HTMLElement|window} 鐩爣鍏冪礌
        */
    baidu.event.on = function (element, type, listener) {
        type = type.replace(/^on/i, '');
        element = baidu.dom._g(element);

        var realListener = function (ev) {
                // 1. 杩欓噷涓嶆敮鎸丒ventArgument,  鍘熷洜鏄法frame鐨勪簨浠舵寕杞�
                // 2. element鏄负浜嗕慨姝his
                listener.call(element, ev);
            },
            lis = baidu.event._listeners,
            filter = baidu.event._eventFilter,
            afterFilter,
            realType = type;
        type = type.toLowerCase();
        // filter杩囨护
        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;
    };

    // 澹版槑蹇嵎鏂规硶
    baidu.on = baidu.event.on;

    /**
     * 杩斿洖涓€涓綋鍓嶉〉闈㈢殑鍞竴鏍囪瘑瀛楃涓层€�
     * @name baidu.lang.guid
     * @function
     * @grammar baidu.lang.guid()
     * @version 1.1.1
     * @meta standard
     *             
     * @returns {String} 褰撳墠椤甸潰鐨勫敮涓€鏍囪瘑瀛楃涓�
     */

    (function(){
        //涓嶇洿鎺ヤ娇鐢╳indow锛屽彲浠ユ彁楂�3鍊嶅乏鍙虫€ц兘
        var guid = context[baidu.guid];

        baidu.lang.guid = function() {
            return "TANGRAM__" + (guid._counter ++).toString(36);
        };

        guid._counter = guid._counter || 1;
    })();

    /**
     * 鎵€鏈夌被鐨勫疄渚嬬殑瀹瑰櫒
     * key涓烘瘡涓疄渚嬬殑guid
     * @meta standard
     */

    context[baidu.guid]._instances = context[baidu.guid]._instances || {};

    /**
     * 鍒ゆ柇鐩爣鍙傛暟鏄惁涓篺unction鎴朏unction瀹炰緥
     * @name baidu.lang.isFunction
     * @function
     * @grammar baidu.lang.isFunction(source)
     * @param {Any} source 鐩爣鍙傛暟
     * @version 1.2
     * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
     * @meta standard
     * @returns {boolean} 绫诲瀷鍒ゆ柇缁撴灉
     */
    baidu.lang.isFunction = function (source) {
        // chrome涓�,'function' == typeof /a/ 涓簍rue.
        return '[object Function]' == Object.prototype.toString.call(source);
    };

    /**
     *    
     * @ignore
     * @class  Tangram缁ф壙鏈哄埗鎻愪緵鐨勪竴涓熀绫伙紝鐢ㄦ埛鍙互閫氳繃缁ф壙baidu.lang.Class鏉ヨ幏鍙栧畠鐨勫睘鎬у強鏂规硶銆�
     * @name 	baidu.lang.Class
     * @grammar baidu.lang.Class(guid)
     * @param 	{string}	guid	瀵硅薄鐨勫敮涓€鏍囪瘑
     * @meta standard
     * @remark baidu.lang.Class鍜屽畠鐨勫瓙绫荤殑瀹炰緥鍧囧寘鍚竴涓叏灞€鍞竴鐨勬爣璇唃uid銆俫uid鏄湪鏋勯€犲嚱鏁颁腑鐢熸垚鐨勶紝鍥犳锛岀户鎵胯嚜baidu.lang.Class鐨勭被搴旇鐩存帴鎴栬€呴棿鎺ヨ皟鐢ㄥ畠鐨勬瀯閫犲嚱鏁般€�<br>baidu.lang.Class鐨勬瀯閫犲嚱鏁颁腑浜х敓guid鐨勬柟寮忓彲浠ヤ繚璇乬uid鐨勫敮涓€鎬э紝鍙婃瘡涓疄渚嬮兘鏈変竴涓叏灞€鍞竴鐨刧uid銆�
     * @meta standard
     * @see baidu.lang.inherits,baidu.lang.Event
     */
    baidu.lang.Class = function(guid) {
        this.guid = guid || baidu.lang.guid();
        context[baidu.guid]._instances[this.guid] = this;
    };
    context[baidu.guid]._instances = context[baidu.guid]._instances || {};

    /**
     * 閲婃斁瀵硅薄鎵€鎸佹湁鐨勮祫婧愶紝涓昏鏄嚜瀹氫箟浜嬩欢銆�
     * @name dispose
     * @grammar obj.dispose()
     */
    baidu.lang.Class.prototype.dispose = function(){
        delete context[baidu.guid]._instances[this.guid];

        for(var property in this){
            if (!baidu.lang.isFunction(this[property])) {
                delete this[property];
            }
        }
        this.disposed = true;
    };

    /**
     * 閲嶈浇浜嗛粯璁ょ殑toString鏂规硶锛屼娇寰楄繑鍥炰俊鎭洿鍔犲噯纭竴浜涖€�
     * @return {string} 瀵硅薄鐨凷tring琛ㄧず褰㈠紡
     */
    baidu.lang.Class.prototype.toString = function(){
        return "[object " + (this._className || "Object" ) + "]";
    };

    /**
     * @ignore
     * @class   鑷畾涔夌殑浜嬩欢瀵硅薄銆�
     * @name 	baidu.lang.Event
     * @grammar baidu.lang.Event(type[, target])
     * @param 	{string} type	 浜嬩欢绫诲瀷鍚嶇О銆備负浜嗘柟渚垮尯鍒嗕簨浠跺拰涓€涓櫘閫氱殑鏂规硶锛屼簨浠剁被鍨嬪悕绉板繀椤讳互"on"(灏忓啓)寮€澶淬€�
     * @param 	{Object} [target]瑙﹀彂浜嬩欢鐨勫璞�
     * @meta standard
     * @remark 寮曞叆璇ユā鍧楋紝浼氳嚜鍔ㄤ负Class寮曞叆3涓簨浠舵墿灞曟柟娉曪細addEventListener銆乺emoveEventListener鍜宒ispatchEvent銆�
     * @meta standard
     * @see baidu.lang.Class
     */
    baidu.lang.Event = function (type, target) {
        this.type = type;
        this.returnValue = true;
        this.target = target || null;
        this.currentTarget = null;
    };

    /**
     * 娉ㄥ唽瀵硅薄鐨勪簨浠剁洃鍚櫒銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆�
     * @grammar obj.addEventListener(type, handler[, key])
     * @param 	{string}   type         鑷畾涔変簨浠剁殑鍚嶇О
     * @param 	{Function} handler      鑷畾涔変簨浠惰瑙﹀彂鏃跺簲璇ヨ皟鐢ㄧ殑鍥炶皟鍑芥暟
     * @param 	{string}   [key]		涓轰簨浠剁洃鍚嚱鏁版寚瀹氱殑鍚嶇О锛屽彲鍦ㄧЩ闄ゆ椂浣跨敤銆傚鏋滀笉鎻愪緵锛屾柟娉曚細榛樿涓哄畠鐢熸垚涓€涓叏灞€鍞竴鐨刱ey銆�
     * @remark 	浜嬩欢绫诲瀷鍖哄垎澶у皬鍐欍€傚鏋滆嚜瀹氫箟浜嬩欢鍚嶇О涓嶆槸浠ュ皬鍐�"on"寮€澶达紝璇ユ柟娉曚細缁欏畠鍔犱笂"on"鍐嶈繘琛屽垽鏂紝鍗�"click"鍜�"onclick"浼氳璁や负鏄悓涓€绉嶄簨浠躲€� 
     */
    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;
    };

    /**
     * 绉婚櫎瀵硅薄鐨勪簨浠剁洃鍚櫒銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆�
     * @grammar obj.removeEventListener(type, handler)
     * @param {string}   type     浜嬩欢绫诲瀷
     * @param {Function|string} handler  瑕佺Щ闄ょ殑浜嬩欢鐩戝惉鍑芥暟鎴栬€呯洃鍚嚱鏁扮殑key
     * @remark 	濡傛灉绗簩涓弬鏁癶andler娌℃湁琚粦瀹氬埌瀵瑰簲鐨勮嚜瀹氫箟浜嬩欢涓紝浠€涔堜篃涓嶅仛銆�
     */
    baidu.lang.Class.prototype.removeEventListener = function (type, handler) {
        if (typeof handler != "undefined") {
            if ( (baidu.lang.isFunction(handler) && ! (handler = handler.hashCode))
                || (! baidu.lang.isString(handler))
            ){
                return;
            }
        }

        !this.__listeners && (this.__listeners = {});

        type.indexOf("on") != 0 && (type = "on" + type);

        var t = this.__listeners;
        if (!t[type]) {
            return;
        }
        if (typeof handler != "undefined") {
            t[type][handler] && delete t[type][handler];
        } else {
            for(var guid in t[type]){
                delete t[type][guid];
            }
        }
    };

    /**
     * 娲惧彂鑷畾涔変簨浠讹紝浣垮緱缁戝畾鍒拌嚜瀹氫箟浜嬩欢涓婇潰鐨勫嚱鏁伴兘浼氳鎵ц銆傚紩鍏aidu.lang.Event鍚庯紝Class鐨勫瓙绫诲疄渚嬫墠浼氳幏寰楄鏂规硶銆�
     * @grammar obj.dispatchEvent(event, options)
     * @param {baidu.lang.Event|String} event 	Event瀵硅薄锛屾垨浜嬩欢鍚嶇О(1.1.1璧锋敮鎸�)
     * @param {Object} 					options 鎵╁睍鍙傛暟,鎵€鍚睘鎬ч敭鍊间細鎵╁睍鍒癊vent瀵硅薄涓�(1.2璧锋敮鎸�)
     * @remark 澶勭悊浼氳皟鐢ㄩ€氳繃addEventListenr缁戝畾鐨勮嚜瀹氫箟浜嬩欢鍥炶皟鍑芥暟涔嬪锛岃繕浼氳皟鐢ㄧ洿鎺ョ粦瀹氬埌瀵硅薄涓婇潰鐨勮嚜瀹氫箟浜嬩欢銆備緥濡傦細<br>
    myobj.onMyEvent = function(){}<br>
    myobj.addEventListener("onMyEvent", function(){});
        */
    baidu.lang.Class.prototype.dispatchEvent = function (event, options) {
        if (baidu.lang.isString(event)) {
            event = new baidu.lang.Event(event);
        }
        !this.__listeners && (this.__listeners = {});

        // 20100603 娣诲姞鏈柟娉曠殑绗簩涓弬鏁帮紝灏� options extend鍒癳vent涓幓浼犻€�
        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;

        // 绫诲悕鏍囪瘑锛屽吋瀹笴lass鐨則oString锛屽熀鏈病鐢�
        if ("string" == typeof className) {
            proto._className = className;
        }
    };
    // 澹版槑蹇嵎鏂规硶
    baidu.inherits = baidu.lang.inherits;


    /**
    
     * 鍥剧墖鐨勮矾寰�

     * @private
     * @type {String}
    
     */
    var _IMAGE_PATH = 'http://api.map.baidu.com/library/TextIconOverlay/1.2/src/images/m';

    /**
    
     * 鍥剧墖鐨勫悗缂€鍚�

      * @private
     * @type {String}
    
     */
    var _IMAGE_EXTENSION  = 'png';

    /**
     *@exports TextIconOverlay as BMapLib.TextIconOverlay
     */
    
    /**
    * TextIconOverlay
    * @class 姝ょ被琛ㄧず鍦板浘涓婄殑涓€涓鐩栫墿锛岃瑕嗙洊鐗╃敱鏂囧瓧鍜屽浘鏍囩粍鎴愶紝浠嶰verlay缁ф壙銆傛枃瀛楅€氬父鏄暟瀛楋紙0-9锛夋垨瀛楁瘝锛圓-Z 锛夛紝鑰屾枃瀛椾笌鍥炬爣涔嬮棿鏈変竴瀹氱殑鏄犲皠鍏崇郴銆�
    *璇ヨ鐩栫墿閫傜敤浜庝互涓嬬被浼肩殑鍦烘櫙锛氶渶瑕佸湪鍦板浘涓婃坊鍔犱竴绯诲垪瑕嗙洊鐗╋紝杩欎簺瑕嗙洊鐗╀箣闂寸敤涓嶅悓鐨勫浘鏍囧拰鏂囧瓧鏉ュ尯鍒嗭紝鏂囧瓧鍙兘琛ㄧず浜嗚瑕嗙洊鐗╃殑鏌愪竴灞炴€у€硷紝鏍规嵁璇ユ枃瀛楀拰涓€瀹氱殑鏄犲皠鍏崇郴锛岃嚜鍔ㄥ尮閰嶇浉搴旈鑹插拰澶у皬鐨勫浘鏍囥€�
    *
    *@constructor
    *@param {Point} position 琛ㄧず涓€涓粡绾害鍧愭爣浣嶇疆銆�
    *@param {String} text 琛ㄧず璇ヨ鐩栫墿鏄剧ず鐨勬枃瀛椾俊鎭€�
    *@param {Json Object} options 鍙€夊弬鏁帮紝鍙€夐」鍖呮嫭锛�<br />
    *"<b>styles</b>":{Array<IconStyle>} 涓€缁勫浘鏍囬鏍笺€傚崟涓浘琛ㄩ鏍煎寘鎷互涓嬪嚑涓睘鎬э細<br />
    *   url	{String}	 鍥剧墖鐨剈rl鍦板潃銆�(蹇呴€�)<br />
    *   size {Size}	鍥剧墖鐨勫ぇ灏忋€傦紙蹇呴€夛級<br />
    *   anchor {Size} 鍥炬爣瀹氫綅鍦ㄥ湴鍥句笂鐨勪綅缃浉瀵逛簬鍥炬爣宸︿笂瑙掔殑鍋忕Щ鍊硷紝榛樿鍋忕Щ鍊间负鍥炬爣鐨勪腑蹇冧綅缃€傦紙鍙€夛級<br />
    *   offset {Size} 鍥剧墖鐩稿浜庡彲瑙嗗尯鍩熺殑鍋忕Щ鍊硷紝姝ゅ姛鑳界殑浣滅敤绛夊悓浜嶤SS涓殑background-position灞炴€с€傦紙鍙€夛級<br />
    *   textSize {Number} 鏂囧瓧鐨勫ぇ灏忋€傦紙鍙€夛紝榛樿10锛�<br />
    *   textColor {String} 鏂囧瓧鐨勯鑹层€傦紙鍙€夛紝榛樿black锛�<br />
    */
    var TextIconOverlay = function(position, text, options){
        try {
            BMap;
        } catch (e) {
            throw Error('Baidu Map JS API is not ready yet!');
        }
        T.lang.inherits(TextIconOverlay, BMap.Overlay, "TextIconOverlay");
        this._position = position;
        this._text = text;
        this._options = options || {};
        this._styles = this._options['styles'] || [];
        (!this._styles.length) && this._setupDefaultStyles();                  
    };


    TextIconOverlay.prototype._setupDefaultStyles = function(){  
        var sizes = [53, 56, 66, 78, 90];
        for(var i = 0, size; size = sizes[i]; i++){
            this._styles.push({
                url:_IMAGE_PATH + i + '.' + _IMAGE_EXTENSION,
                size: new BMap.Size(size, size)
            });
        }//for寰幆鐨勭畝娲佸啓娉�
    };

    /**
    *缁ф壙Overlay鐨刬ntialize鏂规硶锛岃嚜瀹氫箟瑕嗙洊鐗╂椂蹇呴』銆�
    *@param {Map} map BMap.Map鐨勫疄渚嬪寲瀵硅薄銆�
    *@return {HTMLElement} 杩斿洖瑕嗙洊鐗╁搴旂殑HTML鍏冪礌銆�
    */
    TextIconOverlay.prototype.initialize = function(map){
        this._map = map;
    
        this._domElement = document.createElement('div');     
        this._updateCss();    
        this._updateText();
        this._updatePosition(); 
        
        this._bind();

        this._map.getPanes().markerMouseTarget.appendChild(this._domElement);
        return this._domElement;   
    };

    /**
    *缁ф壙Overlay鐨刣raw鏂规硶锛岃嚜瀹氫箟瑕嗙洊鐗╂椂蹇呴』銆�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype.draw = function(){
        this._map && this._updatePosition();
    };
    
    /**
    *鑾峰彇璇ヨ鐩栫墿涓婄殑鏂囧瓧銆�
    *@return {String} 璇ヨ鐩栫墿涓婄殑鏂囧瓧銆�
    */
    TextIconOverlay.prototype.getText = function(){
        return this._text;
    };

    /**
    *璁剧疆璇ヨ鐩栫墿涓婄殑鏂囧瓧銆�
    *@param {String} text 瑕佽缃殑鏂囧瓧锛岄€氬父鏄瓧姣岮-Z鎴栨暟瀛�0-9銆�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype.setText = function(text){
        if(text && (!this._text || (this._text.toString() != text.toString()))){
            this._text = text;
            this._updateText();
            this._updateCss();
            this._updatePosition(); 
        }
    };

    /**
    *鑾峰彇璇ヨ鐩栫墿鐨勪綅缃€�
    *@return {Point} 璇ヨ鐩栫墿鐨勭粡绾害鍧愭爣銆�
    */
    TextIconOverlay.prototype.getPosition = function () {
        return this._position;
    };
   
    /**
    *璁剧疆璇ヨ鐩栫墿鐨勪綅缃€�
    *@param {Point}  position 瑕佽缃殑缁忕含搴﹀潗鏍囥€�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype.setPosition = function (position) {
        if(position && (!this._position || !this._position.equals(position))){
            this._position = position;  
            this._updatePosition();
        }
    };

    /**
    *鐢辨枃瀛椾俊鎭幏鍙栭鏍兼暟缁勭殑瀵瑰簲绱㈠紩鍊笺€�
    *鍐呴儴榛樿鐨勫搴斿嚱鏁颁负鏂囧瓧杞崲涓烘暟瀛楅櫎浠�10鐨勭粨鏋滐紝姣斿鏂囧瓧8杩斿洖绱㈠紩0锛屾枃瀛�25杩斿洖绱㈠紩2.
    *濡傛灉闇€瑕佽嚜瀹氫箟鏄犲皠鍏崇郴锛岃瑕嗙洊璇ュ嚱鏁般€�
    *@param {String} text  鏂囧瓧銆�
    *@param {Array<IconStyle>}  styles 涓€缁勫浘鏍囬鏍笺€�
    *@return {Number} 瀵瑰簲鐨勭储寮曞€笺€�
    */
    TextIconOverlay.prototype.getStyleByText = function(text, styles){
        var count = parseInt(text);
        var index = parseInt(count / 10);
        index = Math.max(0, index);
        index = Math.min(index, styles.length - 1);
        return styles[index]; 
    };

    /**
    *鏇存柊鐩稿簲鐨凜SS銆�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype._updateCss = function(){
        if (!this._domElement) {
            return
        }
        var style = this.getStyleByText(this._text, this._styles);
        this._domElement.style.cssText = this._buildCssText(style);
    };

    /**
    *鏇存柊瑕嗙洊鐗╃殑鏄剧ず鏂囧瓧銆�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype._updateText = function(){
        if (this._domElement) {
            this._domElement.innerHTML = this._text;
        }
    };

    /**
    *璋冩暣瑕嗙洊鐗╁湪鍦板浘涓婄殑浣嶇疆鏇存柊瑕嗙洊鐗╃殑鏄剧ず鏂囧瓧銆�
    *@return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype._updatePosition = function(){
        if (this._domElement && this._position) {
            var style = this._domElement.style;
            var pixelPosition= this._map.pointToOverlayPixel(this._position); 
            pixelPosition.x -= Math.ceil(parseInt(style.width) / 2);
            pixelPosition.y -= Math.ceil(parseInt(style.height) / 2);       
            style.left = pixelPosition.x + "px";
            style.top = pixelPosition.y + "px";
        }
    };
    
    /**
    * 涓鸿瑕嗙洊鐗╃殑HTML鍏冪礌鏋勫缓CSS
    * @param {IconStyle}  涓€涓浘鏍囩殑椋庢牸銆�
    * @return {String} 鏋勫缓瀹屾垚鐨凜SSTEXT銆�
    */
    TextIconOverlay.prototype._buildCssText = function(style) {    
        //鏍规嵁style鏉ョ‘瀹氫竴浜涢粯璁ゅ€�
        var url = style['url'];
        var size = style['size'];
        var anchor = style['anchor'];
        var offset = style['offset'];
        var textColor = style['textColor'] || 'black';
        var textSize = style['textSize'] || 10;

        var csstext = [];
        if (T.browser["ie"] < 7) {
            csstext.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +
                'sizingMethod=scale,src="' + url + '");');
        } else {
            csstext.push('background-image:url(' + url + ');');
            var backgroundPosition = '0 0';
            (offset instanceof BMap.Size) && (backgroundPosition = offset.width + 'px' + ' ' + offset.height + 'px');          
            csstext.push('background-position:' + backgroundPosition + ';');
        }

        if (size instanceof BMap.Size){
            if (anchor instanceof BMap.Size) {
                if (anchor.height > 0 && anchor.height < size.height) {
                      csstext.push('height:' + (size.height - anchor.height) + 'px; padding-top:' + anchor.height + 'px;');
                }
                if(anchor.width > 0 && anchor.width < size.width){
                    csstext.push('width:' + (size.width - anchor.width) + 'px; padding-left:' + anchor.width + 'px;');                
                }
            } else {
                csstext.push('height:' + size.height + 'px; line-height:' + size.height + 'px;');
                csstext.push('width:' + size.width + 'px; text-align:center;');
            }
        }
   
        csstext.push('cursor:pointer; color:' + textColor + '; position:absolute; font-size:' +
            textSize + 'px; font-family:Arial,sans-serif; font-weight:bold');
        return csstext.join('');
    };


    /**
    
     * 褰撻紶鏍囩偣鍑昏瑕嗙洊鐗╂椂浼氳Е鍙戣浜嬩欢

     * @name TextIconOverlay#click

     * @event

     * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細
    
     * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷

     * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣

     *

     */

    /**

     * 褰撻紶鏍囪繘鍏ヨ瑕嗙洊鐗╁尯鍩熸椂浼氳Е鍙戣浜嬩欢

     * @name TextIconOverlay#mouseover

     * @event
     * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細
    
     * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷

     * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣

     * <br />"<b>point</b> : {BMap.Point} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Point瀵硅薄

     * <br />"<b>pixel</b>锛歿BMap.pixel} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Pixel瀵硅薄

     *

     * @example <b>鍙傝€冪ず渚嬶細</b><br />

     * myTextIconOverlay.addEventListener("mouseover", function(e) {  alert(e.point);  });

     */

    /**

     * 褰撻紶鏍囩寮€璇ヨ鐩栫墿鍖哄煙鏃朵細瑙﹀彂璇ヤ簨浠�

     * @name TextIconOverlay#mouseout

     * @event

     * @param {Event Object} e 鍥炶皟鍑芥暟浼氳繑鍥瀍vent鍙傛暟锛屽寘鎷互涓嬭繑鍥炲€硷細

     * <br />"<b>type</b> : {String} 浜嬩欢绫诲瀷

     * <br />"<b>target</b>锛歿BMapLib.TextIconOverlay} 浜嬩欢鐩爣

     * <br />"<b>point</b> : {BMap.Point} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Point瀵硅薄

     * <br />"<b>pixel</b>锛歿BMap.pixel} 鏈€鏂版坊鍔犱笂鐨勮妭鐐笲Map.Pixel瀵硅薄

     *

     * @example <b>鍙傝€冪ず渚嬶細</b><br />

     * myTextIconOverlay.addEventListener("mouseout", function(e) {  alert(e.point);  });

     */


    /**
    * 涓鸿瑕嗙洊鐗╃粦瀹氫竴绯诲垪浜嬩欢
    * 褰撳墠鏀寔click mouseover mouseout
    * @return 鏃犺繑鍥炲€笺€�
    */
    TextIconOverlay.prototype._bind = function(){
        if (!this._domElement){
            return;
        }

        var me = this;
        var map = this._map;

        var BaseEvent = T.lang.Event;
        function eventExtend(e, be){
            var elem = e.srcElement || e.target;
            var x = e.clientX || e.pageX;
            var y = e.clientY || e.pageY;
            if (e && be && x && y && elem){
                var offset = T.dom.getPosition(map.getContainer());
                be.pixel = new BMap.Pixel(x - offset.left, y - offset.top);
                be.point = map.pixelToPoint(be.pixel);
            }
            return be;
        }//缁欎簨浠跺弬鏁板鍔爌ixel鍜宲oint涓や釜鍊�

        T.event.on(this._domElement,"mouseover", function(e){
            me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseover")));
        });
        T.event.on(this._domElement,"mouseout", function(e){
            me.dispatchEvent(eventExtend(e, new BaseEvent("onmouseout")));
        });
        T.event.on(this._domElement,"click", function(e){
            me.dispatchEvent(eventExtend(e, new BaseEvent("onclick")));
        });
    };

    return TextIconOverlay;
});
});

var TextIconOverlay = (index$1 && typeof index$1 === 'object' && 'default' in index$1 ? index$1['default'] : index$1);

/**
 * 鑾峰彇涓€涓墿灞曠殑瑙嗗浘鑼冨洿锛屾妸涓婁笅宸﹀彸閮芥墿澶т竴鏍风殑鍍忕礌鍊笺€�
 * @param {Map} map BMap.Map鐨勫疄渚嬪寲瀵硅薄
 * @param {BMap.Bounds} bounds BMap.Bounds鐨勫疄渚嬪寲瀵硅薄
 * @param {Number} gridSize 瑕佹墿澶х殑鍍忕礌鍊�
 *
 * @return {BMap.Bounds} 杩斿洖鎵╁ぇ鍚庣殑瑙嗗浘鑼冨洿銆�
 */
var getExtendedBounds = function(map, bounds, gridSize){
    bounds = cutBoundsInRange(bounds);
    var pixelNE = map.pointToPixel(bounds.getNorthEast());
    var pixelSW = map.pointToPixel(bounds.getSouthWest()); 
    pixelNE.x += gridSize;
    pixelNE.y -= gridSize;
    pixelSW.x -= gridSize;
    pixelSW.y += gridSize;
    var newNE = map.pixelToPoint(pixelNE);
    var newSW = map.pixelToPoint(pixelSW);
    return new BMap.Bounds(newSW, newNE);
};

/**
 * 鎸夌収鐧惧害鍦板浘鏀寔鐨勪笘鐣岃寖鍥村bounds杩涜杈圭晫澶勭悊
 * @param {BMap.Bounds} bounds BMap.Bounds鐨勫疄渚嬪寲瀵硅薄
 *
 * @return {BMap.Bounds} 杩斿洖涓嶈秺鐣岀殑瑙嗗浘鑼冨洿
 */
var cutBoundsInRange = function (bounds) {
    var maxX = getRange(bounds.getNorthEast().lng, -180, 180);
    var minX = getRange(bounds.getSouthWest().lng, -180, 180);
    var maxY = getRange(bounds.getNorthEast().lat, -74, 74);
    var minY = getRange(bounds.getSouthWest().lat, -74, 74);
    return new BMap.Bounds(new BMap.Point(minX, minY), new BMap.Point(maxX, maxY));
}; 

/**
 * 瀵瑰崟涓€艰繘琛岃竟鐣屽鐞嗐€�
 * @param {Number} i 瑕佸鐞嗙殑鏁板€�
 * @param {Number} min 涓嬭竟鐣屽€�
 * @param {Number} max 涓婅竟鐣屽€�
 * 
 * @return {Number} 杩斿洖涓嶈秺鐣岀殑鏁板€�
 */
var getRange = function (i, mix, max) {
    mix && (i = Math.max(i, mix));
    max && (i = Math.min(i, max));
    return i;
};

/**
 * 鍒ゆ柇缁欏畾鐨勫璞℃槸鍚︿负鏁扮粍
 * @param {Object} source 瑕佹祴璇曠殑瀵硅薄
 *
 * @return {Boolean} 濡傛灉鏄暟缁勮繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse
 */
var isArray = function (source) {
    return '[object Array]' === Object.prototype.toString.call(source);
};

/**
 * 杩斿洖item鍦╯ource涓殑绱㈠紩浣嶇疆
 * @param {Object} item 瑕佹祴璇曠殑瀵硅薄
 * @param {Array} source 鏁扮粍
 *
 * @return {Number} 濡傛灉鍦ㄦ暟缁勫唴锛岃繑鍥炵储寮曪紝鍚﹀垯杩斿洖-1
 */
var indexOf = function(item, source){
    var index = -1;
    if(isArray(source)){
        if (source.indexOf) {
            index = source.indexOf(item);
        } else {
            for (var i = 0, m; m = source[i]; i++) {
                if (m === item) {
                    index = i;
                    break;
                }
            }
        }
    }        
    return index;
};

/**
 *@exports MarkerClusterer as BMapLib.MarkerClusterer
 */

    /**
     * MarkerClusterer
     * @class 鐢ㄦ潵瑙e喅鍔犺浇澶ч噺鐐硅绱犲埌鍦板浘涓婁骇鐢熻鐩栫幇璞$殑闂锛屽苟鎻愰珮鎬ц兘
     * @constructor
     * @param {Map} map 鍦板浘鐨勪竴涓疄渚嬨€�
     * @param {Json Object} options 鍙€夊弬鏁帮紝鍙€夐」鍖呮嫭锛�<br />
     *    markers {Array<Marker>} 瑕佽仛鍚堢殑鏍囪鏁扮粍<br />
     *    girdSize {Number} 鑱氬悎璁$畻鏃剁綉鏍肩殑鍍忕礌澶у皬锛岄粯璁�60<br />
     *    maxZoom {Number} 鏈€澶х殑鑱氬悎绾у埆锛屽ぇ浜庤绾у埆灏变笉杩涜鐩稿簲鐨勮仛鍚�<br />
     *    minClusterSize {Number} 鏈€灏忕殑鑱氬悎鏁伴噺锛屽皬浜庤鏁伴噺鐨勪笉鑳芥垚涓轰竴涓仛鍚堬紝榛樿涓�2<br />
     *    isAverangeCenter {Boolean} 鑱氬悎鐐圭殑钀借剼浣嶇疆鏄惁鏄墍鏈夎仛鍚堝湪鍐呯偣鐨勫钩鍧囧€硷紝榛樿涓哄惁锛岃惤鑴氬湪鑱氬悎鍐呯殑绗竴涓偣<br />
     *    styles {Array<IconStyle>} 鑷畾涔夎仛鍚堝悗鐨勫浘鏍囬鏍硷紝璇峰弬鑰僒extIconOverlay绫�<br />
     */
var MarkerClusterer  = function(map, options){
    try {
        BMap;
    } catch (e) {
        throw Error('Baidu Map JS API is not ready yet!');
    }
    if (!map){
        return;
    }
    this._map = map;
    this._markers = [];
    this._clusters = [];
    
    var opts = options || {};
    this._gridSize = opts["gridSize"] || 60;
    this._maxZoom = opts["maxZoom"] || 18;
    this._minClusterSize = opts["minClusterSize"] || 2;           
    this._isAverageCenter = false;
    if (opts['isAverageCenter'] != undefined) {
        this._isAverageCenter = opts['isAverageCenter'];
    }    
    this._styles = opts["styles"] || [];

    var that = this;
    this._map.addEventListener("zoomend",function(){
        that._redraw();     
    });

    this._map.addEventListener("moveend",function(){
        that._redraw();     
    });

    var mkrs = opts["markers"];
    isArray(mkrs) && this.addMarkers(mkrs);
};

/**
 * 娣诲姞瑕佽仛鍚堢殑鏍囪鏁扮粍銆�
 * @param {Array<Marker>} markers 瑕佽仛鍚堢殑鏍囪鏁扮粍
 *
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype.addMarkers = function(markers){
    if (!markers.length) {
        return
    }
    for(var i = 0, len = markers.length; i <len ; i++){
        this._pushMarkerTo(markers[i]);
    }
    this._createClusters();   
};

/**
 * 鎶婁竴涓爣璁版坊鍔犲埌瑕佽仛鍚堢殑鏍囪鏁扮粍涓�
 * @param {BMap.Marker} marker 瑕佹坊鍔犵殑鏍囪
 *
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype._pushMarkerTo = function(marker){
    var index = indexOf(marker, this._markers);
    if(index === -1){
        marker.isInCluster = false;
        this._markers.push(marker);//Marker鎷栨斁鍚巈nableDragging涓嶅仛鍙樺寲锛屽拷鐣�
    }
};

/**
 * 娣诲姞涓€涓仛鍚堢殑鏍囪銆�
 * @param {BMap.Marker} marker 瑕佽仛鍚堢殑鍗曚釜鏍囪銆�
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype.addMarker = function(marker) {
    this._pushMarkerTo(marker);
    this._createClusters();
};

/**
 * 鏍规嵁鎵€缁欏畾鐨勬爣璁帮紝鍒涘缓鑱氬悎鐐�
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype._createClusters = function(){
    var mapBounds = this._map.getBounds();
    if (!mapBounds.getCenter()) {
        return
    }
    var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize);
    for(var i = 0, marker; marker = this._markers[i]; i++){
        if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){ 
            this._addToClosestCluster(marker);
        }
    }   
};

/**
 * 鏍规嵁鏍囪鐨勪綅缃紝鎶婂畠娣诲姞鍒版渶杩戠殑鑱氬悎涓�
 * @param {BMap.Marker} marker 瑕佽繘琛岃仛鍚堢殑鍗曚釜鏍囪
 *
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype._addToClosestCluster = function (marker){
    var distance = 4000000;
    var clusterToAddTo = null;
    var position = marker.getPosition();
    for(var i = 0, cluster; cluster = this._clusters[i]; i++){
        var center = cluster.getCenter();
        if(center){
            var d = this._map.getDistance(center, marker.getPosition());
            if(d < distance){
                distance = d;
                clusterToAddTo = cluster;
            }
        }
    }

    if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)){
        clusterToAddTo.addMarker(marker);
    } else {
        var cluster = new Cluster(this);
        cluster.addMarker(marker);            
        this._clusters.push(cluster);
    }    
};

/**
 * 娓呴櫎涓婁竴娆$殑鑱氬悎鐨勭粨鏋�
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype._clearLastClusters = function(){
    for(var i = 0, cluster; cluster = this._clusters[i]; i++){            
        cluster.remove();
    }
    this._clusters = [];//缃┖Cluster鏁扮粍
    this._removeMarkersFromCluster();//鎶奙arker鐨刢luster鏍囪璁句负false
};

/**
 * 娓呴櫎鏌愪釜鑱氬悎涓殑鎵€鏈夋爣璁�
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype._removeMarkersFromCluster = function(){
    for(var i = 0, marker; marker = this._markers[i]; i++){
        marker.isInCluster = false;
    }
};

/**
 * 鎶婃墍鏈夌殑鏍囪浠庡湴鍥句笂娓呴櫎
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype._removeMarkersFromMap = function(){
    for(var i = 0, marker; marker = this._markers[i]; i++){
        marker.isInCluster = false;
        var label = marker.getLabel();
        this._map.removeOverlay(marker);
        marker.setLabel(label);
    }
};

/**
 * 鍒犻櫎鍗曚釜鏍囪
 * @param {BMap.Marker} marker 闇€瑕佽鍒犻櫎鐨刴arker
 *
 * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse
 */
MarkerClusterer.prototype._removeMarker = function(marker) {
    var index = indexOf(marker, this._markers);
    if (index === -1) {
        return false;
    }
    this._map.removeOverlay(marker);
    this._markers.splice(index, 1);
    return true;
};

/**
 * 鍒犻櫎鍗曚釜鏍囪
 * @param {BMap.Marker} marker 闇€瑕佽鍒犻櫎鐨刴arker
 *
 * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse
 */
MarkerClusterer.prototype.removeMarker = function(marker) {
    var success = this._removeMarker(marker);
    if (success) {
        this._clearLastClusters();
        this._createClusters();
    }
    return success;
};

/**
 * 鍒犻櫎涓€缁勬爣璁�
 * @param {Array<BMap.Marker>} markers 闇€瑕佽鍒犻櫎鐨刴arker鏁扮粍
 *
 * @return {Boolean} 鍒犻櫎鎴愬姛杩斿洖true锛屽惁鍒欒繑鍥瀎alse
 */
MarkerClusterer.prototype.removeMarkers = function(markers) {
    var success = false;
    for (var i = 0; i < markers.length; i++) {
        var r = this._removeMarker(markers[i]);
        success = success || r; 
    }

    if (success) {
        this._clearLastClusters();
        this._createClusters();
    }
    return success;
};

/**
 * 浠庡湴鍥句笂褰诲簳娓呴櫎鎵€鏈夌殑鏍囪
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype.clearMarkers = function() {
    this._clearLastClusters();
    this._removeMarkersFromMap();
    this._markers = [];
};

/**
 * 閲嶆柊鐢熸垚锛屾瘮濡傛敼鍙樹簡灞炴€х瓑
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype._redraw = function () {
    this._clearLastClusters();
    this._createClusters();
};

/**
 * 鑾峰彇缃戞牸澶у皬
 * @return {Number} 缃戞牸澶у皬
 */
MarkerClusterer.prototype.getGridSize = function() {
    return this._gridSize;
};

/**
 * 璁剧疆缃戞牸澶у皬
 * @param {Number} size 缃戞牸澶у皬
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype.setGridSize = function(size) {
    this._gridSize = size;
    this._redraw();
};

/**
 * 鑾峰彇鑱氬悎鐨勬渶澶х缉鏀剧骇鍒€�
 * @return {Number} 鑱氬悎鐨勬渶澶х缉鏀剧骇鍒€�
 */
MarkerClusterer.prototype.getMaxZoom = function() {
    return this._maxZoom;       
};

/**
 * 璁剧疆鑱氬悎鐨勬渶澶х缉鏀剧骇鍒�
 * @param {Number} maxZoom 鑱氬悎鐨勬渶澶х缉鏀剧骇鍒�
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype.setMaxZoom = function(maxZoom) {
    this._maxZoom = maxZoom;
    this._redraw();
};

/**
 * 鑾峰彇鑱氬悎鐨勬牱寮忛鏍奸泦鍚�
 * @return {Array<IconStyle>} 鑱氬悎鐨勬牱寮忛鏍奸泦鍚�
 */
MarkerClusterer.prototype.getStyles = function() {
    return this._styles;
};

/**
 * 璁剧疆鑱氬悎鐨勬牱寮忛鏍奸泦鍚�
 * @param {Array<IconStyle>} styles 鏍峰紡椋庢牸鏁扮粍
 * @return 鏃犺繑鍥炲€�
 */
MarkerClusterer.prototype.setStyles = function(styles) {
    this._styles = styles;
    this._redraw();
};

/**
 * 鑾峰彇鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€�
 * @return {Number} 鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€�
 */
MarkerClusterer.prototype.getMinClusterSize = function() {
    return this._minClusterSize;
};

/**
 * 璁剧疆鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€�
 * @param {Number} size 鍗曚釜鑱氬悎鐨勬渶灏忔暟閲忋€�
 * @return 鏃犺繑鍥炲€笺€�
 */
MarkerClusterer.prototype.setMinClusterSize = function(size) {
    this._minClusterSize = size;
    this._redraw();
};

/**
 * 鑾峰彇鍗曚釜鑱氬悎鐨勮惤鑴氱偣鏄惁鏄仛鍚堝唴鎵€鏈夋爣璁扮殑骞冲潎涓績銆�
 * @return {Boolean} true鎴杅alse銆�
 */
MarkerClusterer.prototype.isAverageCenter = function() {
    return this._isAverageCenter;
};

/**
 * 鑾峰彇鑱氬悎鐨凪ap瀹炰緥銆�
 * @return {Map} Map鐨勭ず渚嬨€�
 */
MarkerClusterer.prototype.getMap = function() {
    return this._map;
};

/**
 * 鑾峰彇鎵€鏈夌殑鏍囪鏁扮粍銆�
 * @return {Array<Marker>} 鏍囪鏁扮粍銆�
 */
MarkerClusterer.prototype.getMarkers = function() {
    return this._markers;
};

/**
 * 鑾峰彇鑱氬悎鐨勬€绘暟閲忋€�
 * @return {Number} 鑱氬悎鐨勬€绘暟閲忋€�
 */
MarkerClusterer.prototype.getClustersCount = function() {
    var count = 0;
    for(var i = 0, cluster; cluster = this._clusters[i]; i++){
        cluster.isReal() && count++;     
    }
    return count;
};

/**
 * @ignore
 * Cluster
 * @class 琛ㄧず涓€涓仛鍚堝璞★紝璇ヨ仛鍚堬紝鍖呭惈鏈塏涓爣璁帮紝杩橬涓爣璁扮粍鎴愮殑鑼冨洿锛屽苟鏈変簣浠ユ樉绀哄湪Map涓婄殑TextIconOverlay绛夈€�
 * @constructor
 * @param {MarkerClusterer} markerClusterer 涓€涓爣璁拌仛鍚堝櫒绀轰緥銆�
 */
function Cluster(markerClusterer){
    this._markerClusterer = markerClusterer;
    this._map = markerClusterer.getMap();
    this._minClusterSize = markerClusterer.getMinClusterSize();
    this._isAverageCenter = markerClusterer.isAverageCenter();
    this._center = null;//钀借剼浣嶇疆
    this._markers = [];//杩欎釜Cluster涓墍鍖呭惈鐨刴arkers
    this._gridBounds = null;//浠ヤ腑蹇冪偣涓哄噯锛屽悜鍥涜竟鎵╁ぇgridSize涓儚绱犵殑鑼冨洿锛屼篃鍗崇綉鏍艰寖鍥�
    this._isReal = false; //鐪熺殑鏄釜鑱氬悎

    this._clusterMarker = new TextIconOverlay(this._center, this._markers.length, {"styles":this._markerClusterer.getStyles()});
    //this._map.addOverlay(this._clusterMarker);
}

/**
 * 鍚戣鑱氬悎娣诲姞涓€涓爣璁般€�
 * @param {Marker} marker 瑕佹坊鍔犵殑鏍囪銆�
 * @return 鏃犺繑鍥炲€笺€�
 */
Cluster.prototype.addMarker = function(marker){
    if(this.isMarkerInCluster(marker)){
        return false;
    }//涔熷彲鐢╩arker.isInCluster鍒ゆ柇,澶栭潰鍒ゆ柇OK锛岃繖閲屽熀鏈笉浼氬懡涓�

    if (!this._center){
        this._center = marker.getPosition();
        this.updateGridBounds();//
    } else {
        if(this._isAverageCenter){
            var l = this._markers.length + 1;
            var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l;
            var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l;
            this._center = new BMap.Point(lng, lat);
            this.updateGridBounds();
        }//璁$畻鏂扮殑Center
    }

    marker.isInCluster = true;
    this._markers.push(marker);

    var len = this._markers.length;
    if(len < this._minClusterSize ){     
        this._map.addOverlay(marker);
        //this.updateClusterMarker();
        return true;
    } else if (len === this._minClusterSize) {
        for (var i = 0; i < len; i++) {
            var label = this._markers[i].getLabel();
            this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);
            this._markers[i].setLabel(label);
        }
        
    } 
    this._map.addOverlay(this._clusterMarker);
    this._isReal = true;
    this.updateClusterMarker();
    return true;
};

/**
 * 鍒ゆ柇涓€涓爣璁版槸鍚﹀湪璇ヨ仛鍚堜腑銆�
 * @param {Marker} marker 瑕佸垽鏂殑鏍囪銆�
 * @return {Boolean} true鎴杅alse銆�
 */
Cluster.prototype.isMarkerInCluster= function(marker){
    if (this._markers.indexOf) {
        return this._markers.indexOf(marker) != -1;
    } else {
        for (var i = 0, m; m = this._markers[i]; i++) {
            if (m === marker) {
                return true;
            }
        }
    }
    return false;
};

/**
 * 鍒ゆ柇涓€涓爣璁版槸鍚﹀湪璇ヨ仛鍚堢綉鏍艰寖鍥翠腑銆�
 * @param {Marker} marker 瑕佸垽鏂殑鏍囪銆�
 * @return {Boolean} true鎴杅alse銆�
 */
Cluster.prototype.isMarkerInClusterBounds = function(marker) {
    return this._gridBounds.containsPoint(marker.getPosition());
};

Cluster.prototype.isReal = function(marker) {
    return this._isReal;
};

/**
 * 鏇存柊璇ヨ仛鍚堢殑缃戞牸鑼冨洿銆�
 * @return 鏃犺繑鍥炲€笺€�
 */
Cluster.prototype.updateGridBounds = function() {
    var bounds = new BMap.Bounds(this._center, this._center);
    this._gridBounds = getExtendedBounds(this._map, bounds, this._markerClusterer.getGridSize());
};

/**
 * 鏇存柊璇ヨ仛鍚堢殑鏄剧ず鏍峰紡锛屼篃鍗砊extIconOverlay銆�
 * @return 鏃犺繑鍥炲€笺€�
 */
Cluster.prototype.updateClusterMarker = function () {
    if (this._map.getZoom() > this._markerClusterer.getMaxZoom()) {
        this._clusterMarker && this._map.removeOverlay(this._clusterMarker);
        for (var i = 0, marker; marker = this._markers[i]; i++) {
            this._map.addOverlay(marker);
        }
        return;
    }

    if (this._markers.length < this._minClusterSize) {
        this._clusterMarker.hide();
        return;
    }

    this._clusterMarker.setPosition(this._center);
    
    this._clusterMarker.setText(this._markers.length);

    this._clusterMarker.addEventListener && !this._clusterMarker._hasClickEvent && this._clusterMarker.addEventListener("click", function(event){
        this._clusterMarker._hasClickEvent = true;
        this._markers && this._map.setViewport(this.getBounds());
    }.bind(this));
};

/**
 * 鍒犻櫎璇ヨ仛鍚堛€�
 * @return 鏃犺繑鍥炲€笺€�
 */
Cluster.prototype.remove = function(){
    for (var i = 0, m; m = this._markers[i]; i++) {
        var label = this._markers[i].getLabel();
        this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);
        this._markers[i].setLabel(label);
    }//娓呴櫎鏁g殑鏍囪鐐�
    this._map.removeOverlay(this._clusterMarker);
    this._markers.length = 0;
    delete this._markers;
};

/**
 * 鑾峰彇璇ヨ仛鍚堟墍鍖呭惈鐨勬墍鏈夋爣璁扮殑鏈€灏忓鎺ョ煩褰㈢殑鑼冨洿銆�
 * @return {BMap.Bounds} 璁$畻鍑虹殑鑼冨洿銆�
 */
Cluster.prototype.getBounds = function() {
    var bounds = new BMap.Bounds(this._center,this._center);
    for (var i = 0, marker; marker = this._markers[i]; i++) {
        bounds.extend(marker.getPosition());
    }
    return bounds;
};

/**
 * 鑾峰彇璇ヨ仛鍚堢殑钀借剼鐐广€�
 * @return {BMap.Point} 璇ヨ仛鍚堢殑钀借剼鐐广€�
 */
Cluster.prototype.getCenter = function() {
    return this._center;
};

return MarkerClusterer;

})));