﻿function MapSearcher(btn, query, div, map) {
    var _this = this;
    btn.onclick = function(e) { _this.doSearch(); };
    query.onkeydown = function(e) {
        var keyCode = e ? (e.which ? e.which : e.keyCode) : event.keyCode;
        if (keyCode == 13) {
            _this.doSearch();
            return false;
        }
    };
    this.query = query;
    this.div = div;
    this.pageSize = 10;
    this.maxResults = 1000;
    this.map = map;
    this.objectManager = new YMaps.ObjectManager();
    this.map.addOverlay(this.objectManager);
    this.selectedItem = null;
}

MapSearcher.prototype.doSearch = MapSearcher_doSearch;
MapSearcher.prototype.display = MapSearcher_display;
MapSearcher.prototype.notifyError = MapSearcher_notifyError;
MapSearcher.prototype.getPageHandler = MapSearcher_getPageHandler;
MapSearcher.prototype.getLocHandler = MapSearcher_getLocHandler;

function MapSearcher_doSearch() {
    var value = this.query.value || '';
    value = value.replace(/ /g, '');
    this.objectManager.removeAll();
    if (!value.length) {
        return;
    }
    var geocoder = new YMaps.Geocoder(this.query.value, { results: this.maxResults });
    var _this = this;
    YMaps.Events.observe(geocoder, geocoder.Events.Load, function() {
        _this.display(geocoder);
    });

    YMaps.Events.observe(geocoder, geocoder.Events.Fault, function(error) {
        _this.notifyError(error);
    });
}

function MapSearcher_display(gc) {
    var _this = this;
    while (this.div.firstChild)
        this.div.removeChild(this.div.firstChild);
    if (gc.length()) {
        var page = document.createElement('table');
        page.appendChild(document.createElement('tbody'));
        this.div.appendChild(page);

        for (var i = 0; i < gc.length(); i++) {
            var res = gc.get(i);
            var tr = document.createElement('tr');
            page.firstChild.appendChild(tr);
            
            var td1 = document.createElement('td');
            td1.innerHTML = i + 1 + '.';
            tr.appendChild(td1);

            var td2 = document.createElement('td');
            tr.appendChild(td2);
            
            var a = document.createElement('a');
            var ad = res.AddressDetails;
            a.href = '#';
            var loch = this.getLocHandler(res);
            a.onclick = loch;
            td2.appendChild(a);
            a.innerHTML = res.text;

            if (i == 0) {
                tr.className = 'selected';
                this.objectManager.removeAll();
                this.objectManager.add(res);
                this.map.setBounds(res.getBounds());
                this.selectedItem = tr;
            }
            
            if (page.firstChild.childNodes.length >= this.pageSize && i < gc.length() - 1) {
                page = document.createElement('table');
                page.appendChild(document.createElement('tbody'));
                page.style.display = 'none';
                this.div.appendChild(page);
            }
        }
        if (this.div.childNodes.length > 1) {
            var pager = document.createElement('div');
            pager.id = 'pager';
            for (var i = 0; i < this.div.childNodes.length; i++) {
                var a = document.createElement('a');
                a.href = '#';
                a.onclick = this.getPageHandler(i);
                a.innerHTML = i + 1;
                a.className = i == 0 ? 'disabled' : '';
                pager.appendChild(a);
            }
            this.div.appendChild(pager);
        }
    }
    else {
        var nf = document.createElement('div');
        nf.innerHTML = 'По Вашему запросу ничего не найдено.'
        this.div.appendChild(nf);
    }
}

function MapSearcher_notifyError(error) {
    while (this.div.firstChild)
        this.div.removeChild(this.div.firstChild);
    this.div.innerHTML = 'Произошла ошибка. ' + error.message;
}

function MapSearcher_getPageHandler(p) {
    var div = this.div;
    return function(e) {
        var a = this.parentNode.firstChild;
        while (a) {
            a.className = a == this ? 'disabled' : '';
            a = a.nextSibling;
        }
        for (var i = 0; i < div.childNodes.length; i++) {
            div.childNodes[i].style.display = div.childNodes[i].id == 'pager' || i == p ? 'block' : 'none';
        }
        return false;
    }
}

function MapSearcher_getLocHandler(loc) {
    var _this = this;
    return function(e) {
        _this.objectManager.removeAll();
        _this.objectManager.add(loc);
        _this.map.setBounds(loc.getBounds());
        if (_this.selectedItem)
            _this.selectedItem.className = '';
        var tr = this;
        while (tr && tr.tagName.toLowerCase() != 'tr')
            tr = tr.parentNode;
        if (tr) {
            tr.className = 'selected';
            _this.selectedItem = tr;
        }
        return false;
    }
}
