﻿function Cache(m, man) {
    this.regions = [];
    this.regions.length = 0;
    this.listeners = [];
    this.xbXPath = new XBXPath();
}

Cache.prototype.checkAndLoad = Cache_checkAndLoad;
Cache.prototype.loaderRegionCallback = Cache_loaderRegionCallback;
Cache.prototype.loaderPoiCallback = Cache_loaderPoiCallback;
Cache.prototype.notifyAdd = Cache_notifyAdd;
Cache.prototype.addListener = Cache_addListener;
Cache.prototype.loadGroupByMemberID = Cache_loadGroupByMemberID;

function Cache_checkAndLoad(bounds) {
    if (bounds) {
        var loader = new Loader('getregion.ashx', true);
        var _this = this;
        loader.addCallback(200, function(xml) { _this.loaderRegionCallback(xml) });
        loader.sendRequest(new Array({ name: 'l', value: bounds.getLeft() },
                                    { name: 'r', value: bounds.getRight() },
                                    { name: 't', value: bounds.getTop() },
                                    { name: 'b', value: bounds.getBottom() }));
    }
}

function Cache_loaderRegionCallback(xml) {
    var rs = this.xbXPath.selectNodes(xml, 'regions/region[@id]');
    if (rs) {
        for (var i = 0; i < rs.length; i++) {
            var rid = parseInt(rs[i].getAttribute('id'));
            var f = false;
            for (var j = 0; j < this.regions.length && !f; j++) {
                f = (this.regions[j] == rid);
            }
            if (!f) {
                this.regions[this.regions.length] = rid;
                var loader = new Loader('getpoi.ashx', true);
                var _this = this;
                loader.addCallback(200, function(xml) { _this.loaderPoiCallback(xml); });
                loader.sendRequest(new Array({ name: 'rid', value: rid }));
            }
        }
    }
}

function Cache_loaderPoiCallback(xml, args) {
    var pois = this.xbXPath.selectNodes(xml, 'pois/poi');
    if (pois && pois.length) {
        var objs = new Array();
        for (var i = 0; i < pois.length; i++) {
            var xp = pois[i];
            objs[i] = { cat: parseInt(this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'cat')), 10),
                lon: parseFloat(this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'lon'))),
                lat: parseFloat(this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'lat'))),
                name: this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'name')),
                url: this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'url')),
                address: this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'address')),
                id: parseFloat(this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'id'))),
                regionId: parseInt(this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'regionId')), 10),
                workHours: this.xbXPath.getNodeText(this.xbXPath.selectSingleNode(xp, 'workHours'))
            };
        }
        this.notifyAdd(objs, args);
    }
}

function Cache_addListener(listener) {
    this.listeners[this.listeners.length] = listener;
}

function Cache_notifyAdd(objs, args) {
    for (var i = 0; i < this.listeners.length; i++) {
        this.listeners[i].onAdd(objs, args);
    }
}

function Cache_loadGroupByMemberID(id) {
    if (id) {
        var loader = new Loader('getpoi.ashx', false);
        var _this = this;
        loader.addCallback(200, function(xml) { _this.loaderPoiCallback(xml, { centerId: id }); });
        loader.addCallback(200, function(xml) { _this.regions.push(parseInt(_this.xbXPath.getNodeText(_this.xbXPath.selectSingleNode(xml, 'pois/poi/regionId')))); });
        loader.sendRequest([{ name: 'id', value: id}]);
    }
}
