var MAP_INSTANCE = null;

var OBJECT_TYPE_A_RETAIL_CENTERS_ID = 'ot_retail_centers';
var OBJECT_TYPE_A_AREAS_ID = 'ot_areas';
var OBJECT_TYPE_A_MAJOR_RETAILERS_ID = 'ot_major_retailers';
var OBJECT_TYPE_CB_RETAIL_CENTERS_ID = 'otcb_retail_centers';
var OBJECT_TYPE_CB_AREAS_ID = 'otcb_areas';
var OBJECT_TYPE_CB_MAJOR_RETAILERS_ID = 'otcb_major_retailers';

var STAT_ID = 'stat';
var STAT_DMM_CENTER_ID = 'stat_dmm_center';
var STAT_RETAIL_CENTER_ID = 'stat_retail_center';
var STAT_AREA_ID = 'stat_area';
var LEGEND_ID = 'legend';
var MR_LEGEND_ID = 'mrlegend';
var SWITCH_TO_LIST_ID = 'switch_to_list';

var DEFAULT_ZOOM = 12;
var MIN_RETAIL_CENTER_ZOOM = 11;
var MIN_AREA_ZOOM = 10;
var MIN_MAJOR_RETAILER_ZOOM = 11;

var MODE_NONE = 0;
var MODE_DIRECTIONS = 1;
var MODE_MAP = 2;
var MODE_MAP_SELECTION = 3;

Event.observe(window, 'load', function() { 
    var ids = [OBJECT_TYPE_A_RETAIL_CENTERS_ID, OBJECT_TYPE_A_AREAS_ID, OBJECT_TYPE_A_MAJOR_RETAILERS_ID];
    for (var i=0; i<ids.length; i++) if ($(ids[i])) new Hint(ids[i]);
});


var CELL_CONTROL_NONE = -1;
var CELL_CONTROL_CELLS = 0;
var CELL_CONTROL_CELLS_SELECT = 1;
var CELL_CONTROL_DIRECTIONS = 2;

var ICO_COUNT = 25;

function CellsControl() {
    this.switchView = function(type) {
        var cc = $('cells_control');

        var mritems = '';
        if (MAP_INSTANCE.isShowMajorRetailers()) {
            mritems = '<li><a href="javascript:MAP_INSTANCE.selectMajorRetailers()">select major retailers to show</a></li>';
        }

        switch (type) {
            case CELL_CONTROL_CELLS:
                cc.style.display = 'block';
                cc.innerHTML = '<ul><li><a href="javascript:MAP_INSTANCE.startCellsSelection()">select grid cells to explore any area in detail</a></li>' + mritems + '</ul>';
                break;
            case CELL_CONTROL_CELLS_SELECT:
                cc.style.display = 'block';
                cc.innerHTML = '<ul><li><a href="javascript:MAP_INSTANCE.finishCellsSelection()">finished with grid cell selection: show report</a></li><li><a href="javascript:MAP_INSTANCE.removeCellsSelection()">remove grid cell selection</a></li><li><a href="javascript:MAP_INSTANCE.cancelCellsSelection()">cancel grid cell selection</a></li>' + mritems + '</ul>';
                break;
            case CELL_CONTROL_DIRECTIONS:
                cc.style.display = 'block';
                cc.innerHTML = '<ul><li><a href="javascript:MAP_INSTANCE.useEntireMarket()">use the entire market</a></li></ul>';
                break;
            case CELL_CONTROL_NONE:
                if (mritems.length > 0) {
                    cc.style.display = 'block';
                    cc.innerHTML = '<ul>' + mritems + '</ul>';
                
                } else {
                    cc.style.display = 'none';
                }
                break;
        }
    }
}
CellsControl.prototype = new GControl();
CellsControl.prototype.getDefaultPosition = function() { return new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(7, 30)); }
CellsControl.prototype.initialize = function(map) {
    var container = document.createElement('div');
    container.className = 'cellscontrol';
    container.id = 'cells_control';
    map.getContainer().appendChild(container);
    return container;
}


var MarketMap = function(mapid, boundary, start_point, start_zoom, hidden_param_id) {
	this.mapid = mapid;
	this.boundary = boundary;
	this.start_point = start_point;
	this.start_zoom = start_zoom;
	this.map = null;
	this.iconDMMCenter = null;
	this.iconRetailCenter = null;
	this.iconRetailCenterR = null;
	this.iconMicroCenter = null;
	this.iconMicroCenterR = null;
	this.iconMajorRetailer = new Array();
	this.colors = ['#ffffff', '#ffff99', '#ffff66', '#ffcc00', '#ff9900', '#ff0000', '#6600ff'];
	this.freeze = false;
	this.selected_cells = null;
	this.selected_cells_hash = new Array();
	this.cells_control = new CellsControl();
	this.param = '';
	this.major_retailer_hash = null;
	this.major_retailer_list_hash = null;
	this.major_retailer_category_hash = null;
	this.major_retailer_selected = null;
	this.major_retailer_selected_cat = null;
	this.majorRetailerDlg = null;
	this.major_retailer_key = null;
	this.logged_in = null;
	this.switchToListViewMarketsHTML = null;
	this.request_no = 0;
	this.hidden_param_id = hidden_param_id;

	this.init();
} .newClass(function() {

	this.init = function() {
		MAP_INSTANCE = this;

		var a_center = $(OBJECT_TYPE_A_RETAIL_CENTERS_ID);
		if (a_center) Event.observe(a_center, 'click', function() { MAP_INSTANCE.onEntitySel(OBJECT_TYPE_A_RETAIL_CENTERS_ID, OBJECT_TYPE_CB_RETAIL_CENTERS_ID, 'optionsel_retail_center'); });

		var a_area = $(OBJECT_TYPE_A_AREAS_ID);
		if (a_area) Event.observe(a_area, 'click', function() { MAP_INSTANCE.onEntitySel(OBJECT_TYPE_A_AREAS_ID, OBJECT_TYPE_CB_AREAS_ID, 'optionsel_area'); });

		var a_retailer = $(OBJECT_TYPE_A_MAJOR_RETAILERS_ID);
		if (a_retailer) Event.observe(a_retailer, 'click', function() { MAP_INSTANCE.onEntitySel(OBJECT_TYPE_A_MAJOR_RETAILERS_ID, OBJECT_TYPE_CB_MAJOR_RETAILERS_ID, 'optionsel_major_retailer'); });

		var cb = $(OBJECT_TYPE_CB_RETAIL_CENTERS_ID);
		if (cb) Event.observe(cb, 'click', function() { this.checked = !this.checked; });

		cb = $(OBJECT_TYPE_CB_AREAS_ID);
		if (cb) Event.observe(cb, 'click', function() { this.checked = !this.checked; });

		cb = $(OBJECT_TYPE_CB_MAJOR_RETAILERS_ID);
		if (cb) Event.observe(cb, 'click', function() { this.checked = !this.checked; });

		this.initMap();
	}

	this.onEntitySel = function(aid, cbid, cls) {
		var a = $(aid);
		var cb = $(cbid);
		if (a && cb) {
			if (cb.checked) {
				cb.checked = false;
				a.className = 'option';
			} else {
				cb.checked = true;
				a.className = cls;
			}
		}


		this.freeze = false;
		this.onMapChanged();
	}

	this.selectMajorRetailers = function() {
		go('/MajorRetailerSelection.aspx?back_url=' + escape(document.location.href));
	}


	this.isShowRetailCenters = function() {
		var cbRetailCenters = $(OBJECT_TYPE_CB_RETAIL_CENTERS_ID);
		return (cbRetailCenters && cbRetailCenters.checked);
	}

	this.isShowAreas = function() {
		var cbAreas = $(OBJECT_TYPE_CB_AREAS_ID);
		return (cbAreas && cbAreas.checked);
	}

	this.isShowMajorRetailers = function() {
		var cbMajorRetailers = $(OBJECT_TYPE_CB_MAJOR_RETAILERS_ID);
		return (cbMajorRetailers && cbMajorRetailers.checked);
	}

	this.showHint = function(html) {
		var h = $('hint');
		if (h) h.innerHTML = html;
	}

	this.createIcon = function(image_url, width, height, anchorx, anchory) {
		var ret = new GIcon();
		ret.image = image_url;
		ret.iconSize = new GSize(width, height);
		ret.infoWindowAnchor = new GPoint(anchorx, anchory);
		ret.iconAnchor = new GPoint(anchorx, anchory);
		return ret;
	}

	this.getDMMCenterIcon = function() {
		if (!this.iconDMMCenter) this.iconDMMCenter = this.createIcon('/image/ico_centerdmm_map.gif', 18, 15, 9, 8);
		return this.iconDMMCenter;
	}

	this.getRetailCenterIcon = function() {
		if (!this.iconRetailCenter) this.iconRetailCenter = this.createIcon('/image/ico_center_map.gif', 13, 13, 7, 7);
		return this.iconRetailCenter;
	}

	this.getRetailCenterIconR = function() {
		if (!this.iconRetailCenterR) this.iconRetailCenterR = this.createIcon('/image/ico_center_map2.gif', 13, 13, 7, 7);
		return this.iconRetailCenterR;
	}

	this.getMicroCenterIcon = function() {
		if (!this.iconMicroCenter) this.iconMicroCenter = this.createIcon('/image/ico_micro_map.gif', 13, 13, 7, 7);
		return this.iconMicroCenter;
	}

	this.getMicroCenterIconR = function() {
		if (!this.iconMicroCenterR) this.iconMicroCenterR = this.createIcon('/image/ico_micro_map2.gif', 13, 13, 7, 7);
		return this.iconMicroCenterR;
	}

	this.getMajorRetailerIcon = function(ind) {
		var num = (ind - 1) % ICO_COUNT + 1;
		if (!this.iconMajorRetailer[num]) {
			var ico = new GIcon();
			ico.image = '/image/ico_mr' + num + '.gif';
			ico.iconSize = new GSize(13, 18);
			ico.infoWindowAnchor = new GPoint(4, 18);
			ico.iconAnchor = new GPoint(4, 18);

			this.iconMajorRetailer[num] = ico;
		}
		return this.iconMajorRetailer[num];
	}

	this.initMap = function() {
		this.map = new GMap2($(this.mapid));
		this.map.enableInfoWindow();
		this.map.enableDoubleClickZoom();
		this.map.enableContinuousZoom();
		this.map.disableScrollWheelZoom();
		this.map.addControl(new GLargeMapControl());
		this.map.addControl(new GMapTypeControl());
		this.map.addControl(new CellsControl());
		var bound = new GLatLngBounds(new GLatLng(this.boundary.lat1, this.boundary.lon1), new GLatLng(this.boundary.lat2, this.boundary.lon2));
		var center = bound.getCenter();
		var zoom = this.map.getBoundsZoomLevel(bound);
		this.map.setCenter(center, zoom);

		GEvent.addListener(this.map, 'click', function(ov) { MAP_INSTANCE.onMapClick(ov); });
		GEvent.addListener(this.map, 'infowindowbeforeclose', function() { MAP_INSTANCE.freeze = false; });
		GEvent.addListener(this.map, 'infowindowopen', function() { MAP_INSTANCE.freeze = true; });

		if (!this.parseURL()) {
			if (zoom < DEFAULT_ZOOM) {
				this.showDirections(bound);
			} else {
				this.mode = MODE_MAP;
				this.showMainMap();
			}
		}
	}

	this.showDirections = function(b) {
		this.mode = MODE_DIRECTIONS;
		this.showHint('Select part of the market by clicking on box with a label');

		var parts = ['sw', 's', 'se', 'w', 'c', 'e', 'nw', 'n', 'ne'];

		var sw = b.getSouthWest();
		var ne = b.getNorthEast();
		var lat1 = sw.lat();
		var lon1 = sw.lng();
		var lat2 = ne.lat();
		var lon2 = ne.lng();
		if (lat1 > lat2) { var tmp = lat1; lat1 = lat2; lat2 = lat1; }
		if (lon1 > lon2) { var tmp = lon1; lon1 = lon2; lon2 = lon1; }

		var latStep = (lat2 - lat1) / 3;
		var lonStep = (lon2 - lon1) / 3;
		var ilat, ilon;
		for (ilat = 0; ilat < 3; ilat++) {
			for (ilon = 0; ilon < 3; ilon++) {
				var lat = latStep * ilat + lat1;
				var lon = lonStep * ilon + lon1;

				var p1 = new GLatLng(lat, lon);
				var p2 = new GLatLng(lat + latStep, lon);
				var p3 = new GLatLng(lat + latStep, lon + lonStep);
				var p4 = new GLatLng(lat, lon + lonStep);
				var bounds = new GLatLngBounds(p1, p3);

				var ind = ilat * 3 + ilon;
				var dir = null;
				if (ind < parts.length) {
					dir = parts[ind];
					var g = new GGroundOverlay('/image/' + dir + '.gif', bounds);
					this.map.addOverlay(g);
				}

				var p = new GPolygon([p1, p2, p3, p4, p1], '#000033', 2, 1, '#aa0000', 0.2);
				p.bounds = bounds;
				this.map.addOverlay(p);
			}
		}

		this.cells_control.switchView(CELL_CONTROL_DIRECTIONS);

		this.updateURL();
	}

	this.useEntireMarket = function() {
		this.mode = MODE_MAP;
		this.map.clearOverlays();
		this.showMainMap();
	}

	this.showMainMap = function(centroid, zoom, selected) {
		if (centroid && zoom) this.map.setCenter(centroid, zoom);

		this.selected_cells = new Array();
		this.selected_cells_hash = new Array();
		if (selected) {
			try {
				for (var i = 0; i < selected.length; i++) {
					var id = parseInt(selected[i]);
					this.selected_cells_hash[id] = this.selected_cells.length;
					this.selected_cells[this.selected_cells.length] = id;
				}
			}
			catch (e) { }
		}

		GEvent.addListener(this.map, 'moveend', function() { MAP_INSTANCE.onMapChanged(); });
		GEvent.addListener(this.map, 'movestart', function() { if ((MAP_INSTANCE.mode == MODE_MAP || MAP_INSTANCE.mode == MODE_MAP_SELECTION) && MAP_INSTANCE.freeze) { MAP_INSTANCE.map.closeInfoWindow(); } });


		this.onMapChanged();

	}

	this.onMapChanged = function() {
		this.updateURL();
		if (!this.freeze) {
			this.showSwitchToListLink(null);
			if (this.mode == MODE_MAP || this.mode == MODE_MAP_SELECTION) {
				this.showHint('Use <i>Retail Centers</i>, <i>Retail Districts</i> and <i>Major Retailers</i> to show/hide objects on the map');

				var zoom = this.map.getZoom();

				var cRetailCenters = this.isShowRetailCenters();
				var cAreas = this.isShowAreas();
				var cMajorRetailers = this.isShowMajorRetailers();

				var zRetailCenters = (zoom >= MIN_RETAIL_CENTER_ZOOM);
				var zAreas = (zoom >= MIN_AREA_ZOOM);
				var zMajorRetailers = (zoom >= MIN_MAJOR_RETAILER_ZOOM);

				var zoom_objects = new Array();
				if (cRetailCenters && !zRetailCenters) zoom_objects[zoom_objects.length] = 'Retail Centers';
				if (cAreas && !zAreas) zoom_objects[zoom_objects.length] = 'Retail Districts';
				if (cMajorRetailers && !zMajorRetailers) zoom_objects[zoom_objects.length] = 'Major Retailers';
				if (zoom_objects.length > 0) {
					var msg = 'Zoom IN to see ';
					for (var i = 0; i < zoom_objects.length - 1; i++) {
						if (i > 0) msg += ', ';
						msg += zoom_objects[i];
					}
					if (zoom_objects.length > 1) msg += ' and ';
					msg += zoom_objects[zoom_objects.length - 1];
					this.showHint(msg);
				}


				var b = this.map.getBounds();
				var sw = b.getSouthWest();
				var ne = b.getNorthEast();

				var proxy = new MarketMapAjax();
				proxy.GetObjects((++this.request_no), ne.lat(), ne.lng(), sw.lat(), sw.lng(),
                    cRetailCenters && zRetailCenters, cAreas && zAreas, cMajorRetailers && zMajorRetailers,
                    this.getScreeningID(), this.getVariableID(),
                    function(data) { MAP_INSTANCE.onShowObjects(data); },
                    function() { showModalDialog('Internal server error', MD_OK, 'modal_dlg'); });
			}

			this.invalidateUI();
		}

	}

	this.getScreeningID = function() {
		return SCREENING_NONE;
	}

	this.getVariableID = function() {
		return -1;
	}

	this.invalidateUI = function() {
		if (this.isShowAreas()) {
			switch (this.mode) {
				case MODE_MAP: this.cells_control.switchView(CELL_CONTROL_CELLS); break;
				case MODE_MAP_SELECTION: this.cells_control.switchView(CELL_CONTROL_CELLS_SELECT); break;
			}
		} else {
			this.cells_control.switchView(CELL_CONTROL_NONE);
		}


		var legend = $(LEGEND_ID);
		if (legend) legend.style.display = (this.isShowAreas() && (this.mode == MODE_MAP || this.mode == MODE_MAP_SELECTION) && (this.getScreeningID() != SCREENING_EMPTY)) ? 'block' : 'none';

	}

	this.onMapClick = function(ov) {
		if (ov) {
			switch (this.mode) {
				case MODE_DIRECTIONS:
					if (ov.bounds != null) {
						this.map.clearOverlays();
						this.map.setCenter(ov.bounds.getCenter(), DEFAULT_ZOOM);
						this.mode = MODE_MAP;
						this.showMainMap();
					}
					break;

				case MODE_MAP_SELECTION:
					if (ov.id && (ov.type != null)) {
						var ind = this.selected_cells_hash[ov.id];
						if (ind == null && this.selected_cells.length >= MAX_SELECTED_CELLS) {
							showModalDialog('A maximum of ' + MAX_SELECTED_CELLS + ' grid cells can be selected. To work with more than ' + MAX_SELECTED_CELLS + ' grid cells, please use <a href="/CustomAreaList.aspx"><strong>custom areas</strong></a> ', MD_OK, 'modal_dlg');
						} else {
							var pts = new Array();
							for (var i = 0; i < ov.getVertexCount(); i++) pts[pts.length] = ov.getVertex(i);
							this.map.removeOverlay(ov);

							var p;
							if (ind == null) {
								p = new GPolygon(pts, '#000033', 4, 1, this.colors[ov.type], 0.8);
								this.selected_cells_hash[ov.id] = this.selected_cells.length;
								this.selected_cells[this.selected_cells.length] = ov.id;
							}
							else {
								p = new GPolygon(pts, '#000033', 2, 1, this.colors[ov.type], 0.3);
								this.selected_cells.splice(ind, 1);
								this.selected_cells_hash[ov.id] = null;
							}
							p.id = ov.id;
							p.type = ov.type;

							this.map.addOverlay(p);
						}
					}
					break;
			}
		}
	}

	this.showSwitchToListLink = function(urls) {
		var retail_centers = new Array();
		var major_retailers = new Array();

		if (urls) {
			for (var i = 0; i < urls.length; i++) {
				var u = urls[i];
				switch (u.Entity) {
					case ENTITY_RETAIL_CENTER: retail_centers[retail_centers.length] = u; break;
					case ENTITY_MAJOR_RETAILER: major_retailers[major_retailers.length] = u; break;
				}
			}
		}

		var html = new Array();
		if (retail_centers.length > 0) {
			html[html.length] = '<div class="switch_to_list_section"><strong>Retail Centers</strong>';
			for (var i = 0; i < retail_centers.length; i++) html[html.length] = '<br/><a href="' + retail_centers[i].URL + '" onclick="go(this.href)">' + retail_centers[i].Name + '</a>';
			html[html.length] = '</div>';
		}

		if (major_retailers.length > 0) {
			html[html.length] = '<div class="switch_to_list_section"><strong>Major Retailers</strong>';
			for (var i = 0; i < major_retailers.length; i++) html[html.length] = '<br/><a href="' + major_retailers[i].URL + '" onclick="go(this.href)">' + major_retailers[i].Name + '</a>';
			html[html.length] = '</div>';
		}

		var lnk = $(SWITCH_TO_LIST_ID);
		if (lnk) {
			lnk.style.display = (html.length > 0 ? 'block' : 'none');
			lnk.href = 'javascript:MAP_INSTANCE.switchToListView()';
		}
		this.switchToListViewMarketsHTML = html.join('\n');
	}

	this.switchToListView = function() {
		var lnk = $(SWITCH_TO_LIST_ID);
		if (lnk && this.switchToListViewMarketsHTML) {
			var pos = Element.cumulativeOffset(lnk);
			var sz = Element.getDimensions(lnk);
			showPopupWindow('market_switch', this.switchToListViewMarketsHTML, pos.left, pos.top + sz.height + 2);
		}
	}


	this.onShowObjects = function(data) {
		if (data && data.RequestNo != this.request_no) return;

		this.map.clearOverlays();

		if (data) {
			if (this.logged_in == true && data.LoggedIn == false) showModalDialog('Your session has been expired. Please <a href="/Login.aspx"><strong>relogin</strong></a> to see all data you have access to.', MD_OK, 'modal_dlg');
			this.logged_in = data.LoggedIn;

			this.showSwitchToListLink(data.MarketURL);

			var result = data.List;
			if (result) {
				var dmm_centers = new Array();
				var retail_centers = new Array();
				var areas = new Array();
				var major_retailers = new Array();

				for (var i = 0; i < result.length; i++) {
					var data = result[i];
					switch (data.Entity) {
						case ENTITY_RETAIL_CENTER: if (data.DMM) dmm_centers[dmm_centers.length] = data; else retail_centers[retail_centers.length] = data; break;
						case ENTITY_RETAIL_AREA: areas[areas.length] = data; break;
						case ENTITY_MAJOR_RETAILER: major_retailers[major_retailers.length] = data; break;
					}
				}

				if (areas.length > 0) this.showArea(areas);
				if (retail_centers.length > 0) this.showRetailCenter(retail_centers);
				if (dmm_centers.length > 0) this.showDMMCenter(dmm_centers);


				this.showMajorRetailer(major_retailers);


				var sDMMCenter = $(STAT_DMM_CENTER_ID);
				var sRetailCenter = $(STAT_RETAIL_CENTER_ID);
				var sArea = $(STAT_AREA_ID);

				if (sDMMCenter) { if (dmm_centers.length > 0) { sDMMCenter.style.display = 'block'; sDMMCenter.innerHTML = dmm_centers.length + ' - DMM Centers'; } else sDMMCenter.style.display = 'none'; }
				if (sRetailCenter) { if (this.isShowRetailCenters()) { sRetailCenter.style.display = 'block'; sRetailCenter.innerHTML = retail_centers.length + ' - Retail Centers'; } else sRetailCenter.style.display = 'none'; }
				if (sArea) { if (this.isShowAreas()) { sArea.style.display = 'block'; sArea.innerHTML = areas.length + ' - Retail Districts'; } else sArea.style.display = 'none'; }

				var s = $(STAT_ID);
				if (s) s.style.display = (this.isShowRetailCenters() || this.isShowAreas() ? 'block' : 'none');
			}
		}
	}

	this.createMarker = function(latlng, icon, zidx) {
		var m = new GMarker(latlng, { icon: icon, zIndexProcess: function() { return zidx; } });
		return m;
	}

	this.showDMMCenter = function(list) {
		for (var i = 0; i < list.length; i++) {
			var data = list[i];
			var ico = (data.DMM ? this.getDMMCenterIcon() : (data.R ? this.getRetailCenterIconR() : this.getRetailCenterIcon()));
			var m = this.createMarker(new GLatLng(data.Lat, data.Lon), ico, 4);
			m.cdata = data;
			this.map.addOverlay(m);

			GEvent.addListener(m, 'click', function() {
				var proxy = new MarketMapAjax();
				var mm = this;
				proxy.GetCenterNameAndURL(this.cdata.ID, function(ret) {
					if (ret) {
						var url = ret.URL + '?back_url=' + escape(document.location.href);
						var html = '<h4>' + ret.Name + '</h4><ul class="list"><li><a href="' + url + '">see details</a></li><li><a href="' + url + '#reports">' + (mm.cdata.DMM ? 'see reports with DMM report available' : 'see reports') + '</a></li></ul>';
						mm.openInfoWindowHtml(html);
					}
				}, function() {
					showModalDialog('Internal server error', MD_OK, 'modal_dlg');
				});

			});
		}
	}


	this.showRetailCenter = function(list) {
		for (var i = 0; i < list.length; i++) {
			var data = list[i];
			var ico = '';
			switch (data.VID) {
				case CENTER_VARIANT_MICRO:
					ico = (data.R ? this.getMicroCenterIconR() : this.getMicroCenterIcon());
					break;
				default:
					ico = (data.R ? this.getRetailCenterIconR() : this.getRetailCenterIcon());
					break;
			}

			var m = this.createMarker(new GLatLng(data.Lat, data.Lon), ico, 3);
			m.cdata = data;
			this.map.addOverlay(m);

			GEvent.addListener(m, 'click', function() {
				var proxy = new MarketMapAjax();
				var mm = this;
				proxy.GetCenterNameAndURL(this.cdata.ID, function(ret) {
					if (ret) {
						var url = ret.URL + '?back_url=' + escape(document.location.href);
						var html = '<h4>' + ret.Name + '</h4><ul class="list"><li><a href="' + url + '">see details</a></li><li><a href="' + url + '#reports">' + (mm.cdata.DMM ? 'see reports with DMM report available' : 'see reports') + '</a></li></ul>';
						mm.openInfoWindowHtml(html);
					}
				}, function() {
					showModalDialog('Internal server error', MD_OK, 'modal_dlg');
				});

			});
		}
	}

	this.showArea = function(list) {
		for (i = 0; i < list.length; i++) {
			var id = list[i].ID;
			var type = list[i].Type;

			var b = GetCellBoundary(id);
			var p1 = new GLatLng(b.lat1, b.lon1);
			var p2 = new GLatLng(b.lat2, b.lon1);
			var p3 = new GLatLng(b.lat2, b.lon2);
			var p4 = new GLatLng(b.lat1, b.lon2);

			var p = this.selected_cells_hash[id] != null ?
                new GPolygon([p1, p2, p3, p4, p1], '#000033', 4, 1, this.colors[type], 0.8) :
                new GPolygon([p1, p2, p3, p4, p1], '#000033', 2, 1, this.colors[type], 0.3);

			p.id = id;
			p.type = type;
			p.boundary = b;

			this.map.addOverlay(p);
		}
	}


	this.showMajorRetailer = function(list) {
		if (!this.major_retailer_key && list.length > 0) {
			var proxy = new MarketMapAjax();
			proxy.GetSelectedMajorRetailers(function(ret) {
				if (ret) {
					MAP_INSTANCE.major_retailer_key = ret;
					MAP_INSTANCE.showMajorRetailer(list);
				}
			}, function() {
				showModalDialog('Internal server error', MD_OK, 'modal_dlg');
			});
		} else {
			var mrhash = new Array();
			if (this.major_retailer_key)
				for (var i = 0; i < this.major_retailer_key.length; i++)
				mrhash[this.major_retailer_key[i].ID] = i;

			var used = new Array();
			if (list.length > 0) {
				for (var i = 0; i < list.length; i++) {
					var data = list[i];

					if (!used[data.MRID]) used[data.MRID] = 1;
					else used[data.MRID]++;

					var idx = mrhash[data.MRID];
					var m = this.createMarker(new GLatLng(data.Lat, data.Lon), this.getMajorRetailerIcon(this.major_retailer_key[idx].CIdx), 100);
					m.MRName = this.major_retailer_key[idx].Name;
					m.RID = data.ID;
					this.map.addOverlay(m);

					GEvent.addListener(m, 'click', function() {
						var proxy = new MarketMapAjax();
						var mm = this;
						proxy.GetMajorRetailerNameAddressAndURL(this.RID, function(ret) {
							if (ret) {
								var url = ret.URL + '?back_url=' + escape(document.location.href);
								var html = '<h4>' + ret.Name + '</h4><p>' + ret.Address + '</p><ul class="list"><li><a href="' + url + '">see details</a></li><li><a href="' + url + '#reports">see reports</a></li></ul>';
								mm.openInfoWindowHtml(html);
							}
						}, function() {
							showModalDialog('Internal server error', MD_OK, 'modal_dlg');
						});
					});
				}
			}

			var legend = $(MR_LEGEND_ID);
			if (legend) {
				var html = new Array();
				if (this.major_retailer_key) {
					for (var i = 0; i < this.major_retailer_key.length; i++) {
						var mr = this.major_retailer_key[i];
						if (used[mr.ID]) {
							html[html.length] = '<div class="ico_mr' + ((mr.CIdx - 1) % ICO_COUNT + 1) + '">' + mr.Name + ' - ' + used[mr.ID] + '</div>';
						}
					}
				}
				legend.style.display = (html.length > 0 ? 'block' : 'none');
				legend.innerHTML = html.join('\n');
			}


		}
	}

	this.updateURL = function() {
		var u = document.location.href;
		var i = u.indexOf('#');
		if (i != -1) u = u.substring(0, i);
		u = u + '#';

		var en = (this.isShowRetailCenters() ? 1 : 0) + (this.isShowAreas() ? 2 : 0) + (this.isShowMajorRetailers() ? 4 : 0);
		this.param = this.mode + '/' + en;
		if (this.mode == MODE_MAP || this.mode == MODE_MAP_SELECTION) {
			var c = this.map.getCenter();
			var z = this.map.getZoom();
			this.param = this.param + '/' + c.lat() + '/' + c.lng() + '/' + z + '/' + this.getScreeningID() + '/' + this.getVariableID();
		}

		if (this.hidden_param_id) {
			var hid = $(this.hidden_param_id);
			if (hid) hid.value = this.param;
		}

		document.location.href = u + this.param;
	}

	this.parseURL = function() {
		var u = document.location.href;
		var i = u.indexOf('#');
		if (i != -1) {
			u = u.substring(i + 1);
			var parts = u.split('/');
			if (parts.length >= 7 && parts.length <= 8) {
				try {
					var mode = parseInt(parts[0]);
					var en = parseInt(parts[1]);
					var lat = parseFloat(parts[2]);
					var lon = parseFloat(parts[3]);
					var zoom = parseInt(parts[4]);
					this.screeningID = parseInt(parts[5]);
					this.variableID = parseInt(parts[6]);

					this.setEntitySelected(OBJECT_TYPE_A_RETAIL_CENTERS_ID, OBJECT_TYPE_CB_RETAIL_CENTERS_ID, 'optionsel_retail_center', (en & 1) > 0);
					this.setEntitySelected(OBJECT_TYPE_A_AREAS_ID, OBJECT_TYPE_CB_AREAS_ID, 'optionsel_area', (en & 2) > 0);
					this.setEntitySelected(OBJECT_TYPE_A_MAJOR_RETAILERS_ID, OBJECT_TYPE_CB_MAJOR_RETAILERS_ID, 'optionsel_major_retailer', (en & 4) > 0);

					this.mode = mode;
					switch (mode) {
						case MODE_DIRECTIONS:
							this.showDirections();
							break;

						case MODE_MAP:
						case MODE_MAP_SELECTION:
							var selected = null;
							if (parts.length == 8) {
								this.selected_cells = new Array();
								this.selected_cells_hash = new Array();

								selected = parts[7].split(',');
							}
							this.showMainMap(new GLatLng(lat, lon), zoom, selected);
							break;

					}

					return true;
				} catch (e) { }
			}
		}

		return false;
	}

	this.setEntitySelected = function(aid, cbid, cls, sel) {
		var a = $(aid);
		var cb = $(cbid);
		if (a && cb) {
			if (!sel) {
				cb.checked = false;
				a.className = 'option';
			} else {
				cb.checked = true;
				a.className = cls;
			}
		}
	}

	this.finishCellsSelection = function() {
		if (this.selected_cells && this.selected_cells.length > 0) {
			var url = '/retail-area-details/';
			for (var i = 0; i < this.selected_cells.length; i++) {
				if (i > 0) url += ',';
				url += this.selected_cells[i];
			}
			url += '.aspx?param=' + this.param;
			go(url);
		}
	}

	this.removeCellsSelection = function() {
		this.selected_cells_hash = new Array();
		this.selected_cells = new Array();
		this.onMapChanged();
	}

	this.startCellsSelection = function() {
		this.mode = MODE_MAP_SELECTION;
		this.onMapChanged();
	}

	this.cancelCellsSelection = function() {
		this.mode = MODE_MAP;
		this.onMapChanged();
	}


});

