﻿function AmenityManager(url, map, listContainerId, max){
    this.http = new WDCHttp(url);
    this.map = map;
    this.listContainer = null;
    this.maxResults = max;
    
    this.amenities = [];
    this.selectedTypes = [];
    this.MAXZOOM = 14;
    this.MAXLATDELTA = 0.054
    this.MAXLNGDELTA = 0.132
    
    this.init(listContainerId);
}

AmenityManager.prototype.init = function(listContainerId){    
    if(listContainerId){
        this.listContainer = document.getElementById(listContainerId);
    }

    var oThis = this;
    this.map.addMapMoveCallback('amenity',function(){
        if(oThis.selectedTypes.length>0){
            oThis.getAmenities();
        }
    });
};

AmenityManager.prototype.addType = function(type){
    if(this.selectedTypes.indexOf(type) == -1&&type>0){
        this.selectedTypes[this.selectedTypes.length]=type;
    }
};

AmenityManager.prototype.removeType = function(type){
    var i = this.selectedTypes.indexOf(type);
    if(i>-1){
        this.selectedTypes = this.selectedTypes.splice(i,1);
    }
};

AmenityManager.prototype.clearTypes = function(){
    this.selectedTypes = [];
};

AmenityManager.prototype.clearAmenities = function () {
    this.amenities = [];
    this.map.clearMarkers(AMENITY_MARKER_TYPE);
    if(this.listContainer!=null){
        this.listContainer.innerHTML = '';
        this.listContainer.style.display = 'none';
    }
};

AmenityManager.prototype.getTypeCSV = function () {
    if(this.selectedTypes.length==0){
        return "";
    }
    return this.selectedTypes.join(",");
};


AmenityManager.prototype.updateMap = function(){
    var markers = [];
    var amenityDisplay = '<div><b>Points of Interest</b></div>';
    if(this.amenities.length==0){
        amenityDisplay += "0 Available";
    }
    var context = this;
    var markerClick = function(c,m){
        if(m.info.desc!=null){
            c.showMarkerPopup(c, m);
        } else {
            context.getAmenity(m.info.id,m.info.catId,function(aContext, result){
                    if(result!=null&&result.error==null&&result.length>0){
                        var html = '<div style="text-align:left;margin:10px auto;width:190px">' + result[0].name + "<br />" + result[0].addr + "<br />" + result[0].city + ", " + result[0].state + "<br />" + result[0].phone + "<br />Type: " + result[0].lob + '</div>';
                        m.info.desc = html;
                        c.showMarkerPopup(c,m);
                    }
                });
        }
    };
    
    for(var i=0;i<this.amenities.length;i++){
        var a = this.amenities[i];
        markers[i]={"id":a.id,"group":AMENITY_MARKER_TYPE,"lat":a.lat,"lng":a.lng,desc:null,"url":null,"onclick":markerClick,"icon" : AMENITY_ICON,"catId":a.t};
        
        var img = _appPath + '/images/mapIcons/marker' + (1+i) + '.png';
        amenityDisplay += '<div class="amenityItem"><a href="javascript:void(0);"><img src="'+ img + '"/>' + a.name + '</a> ' + a.addr + '</div>';
    }
    if(this.listContainer!=null){
        this.listContainer.innerHTML = amenityDisplay;
        this.listContainer.style.display = '';
    }
    this.map.clearMarkers(AMENITY_MARKER_TYPE);
    if(markers.length>0){
        this.map.addMarkers(markers, false);
    }
};

AmenityManager.prototype.displayError = function(message){
    if(this.listContainer!=null){
        this.listContainer.innerHTML = '<div><b>Points of Interest</b></div><div>' + message + '</div>';
        this.listContainer.style.display = '';
    }
};

AmenityManager.prototype.getAmenity = function(amentiyIdCSV,type, callback){
    var params = String.format('mode=display&id={0}&t={1}', amentiyIdCSV,type);
    this.http.get(this,params,callback);
};

/*
 * Request amenities
 */
AmenityManager.prototype.getAmenities = function (responseCallback, errorCallback) {
    var params = "b=" + this.map.getBounds(this.MAXLATDELTA,this.MAXLNGDELTA) + "&t=" + this.getTypeCSV();
    if(this.maxResults!=null){
        params+="&max="+this.maxResults;
    }
    if(this.selectedTypes.length==0){
        this.clearAmenities();
        this.http.abort();
    } else{
        this.map.showWait();
        this.http.get(this,params,function(context,result){
            context.map.hideWait();
            if(result.error){
                context.clearAmenities();
                context.displayError(result.error.message);
               if(errorCallback){
                    errorCallback(result);
                }
            } else {
                context.amenities = result.amenities;
                context.updateMap();
                if(responseCallback) {
                    responseCallback(context);
                }
            }
        });
    }
};



