AWP.Layer.Markers = OpenLayers.Class(OpenLayers.Layer.Markers, {
	layerId: '',
	title: 'Untitled Layer',
	category: '',
	/**
	 * For tree
	 */
	text: '',
	icon: '',
	checked: false,

	type: null,
 	sphericalMercator: true,

    initialize: function(config) {
		config = config || {};

		this.layerId = config.layerId || '';
		this.category = config.category || '';
		this.text = config.name || this.layerId || 'Untitled layer';
		this.icon = config.icon || 'image/layer.png';

		if (config.checked === true) this.checked = true;

		var options = {
			visibility: config.visibility === true ? true : false,
			location: config.location || ''
		};

		if (config.styles) this.children = config.styles;

		OpenLayers.Layer.Text.prototype.initialize.call(this, this.text, options);

		this.events.register("loadend", this, this.loadend);
		this.events.register("visibilitychanged", this, this.visibilitychanged);

		AWP.Layer.array.push(this);
		AWP.Layer.items[this.layerId] = this;
    },
    loadend: function() {
    	this.map.events.register("click", this, this.onMapClick);
    },
    visibilitychanged: function(ee) {
    	var layer = ee.object;

    	if (layer.visibility) {
    		this.map.events.register("click", this, this.onMapClick);
    	} else {
    		this.onMapClick();
    		this.map.events.unregister("click", this, this.onMapClick);
    	}

    	if (AWP.map.googleEarth && AWP.map.googleEarth.ge) {
			AWP.map.googleEarth.showIndicators(this.indicator_data, layer.visibility);
		}
	},
	onMapClick: function() {
		var popup = AWP.Marker.current_popup;

		if (popup) {
			popup.destroy();
		}

		AWP.Marker.current_popup = null;
		AWP.Marker.current_icon = null;
	},
	moveTo: function(bounds, zoomChanged, minor) {
        OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
        if (this.visibility && !this.loaded) {
            this.loadData();
        }
		if (zoomChanged) {
			this.mapZoomChanged();
		}
    },
	drawMarker: function(marker) {
        var px = this.map.getLayerPxFromLonLat(marker.lonlat);
        if (px == null) {
            marker.display(false);
        } else {
            if (!marker.isDrawn()) {
                var div_markers = marker.draw(px);
                this.div.appendChild(div_markers);
            //} else if(marker.icon) {
			} else {
				marker.moveTo(px);
                //marker.icon.moveTo(px);
            }
        }
    },
	loadData: function() {
		if (!this.loaded) {
			if (this.location != null) {
				var onFail = function(e) {
					this.events.triggerEvent("loadend");
				};

				this.events.triggerEvent("loadstart");
				OpenLayers.Request.GET({
					url: this.location,
					success: this.parseData,
					failure: onFail,
					scope: this
				});
				this.loaded = true;
			}
		}
	},
	indicator_data: null,
	parseData: function(response) {
		var json;
		try {
			json = eval('(' + response.responseText + ')');
		} catch (e) {
			alert(e + '\n\n' + response.responseText);
		}
		
		// 实时数据相关，通过首页右侧 Real-time Data 图层打开相应图层中的实时数据图标可以触发此处代码
		if (json.icon) {
			var indicators = AWP.createRecords(json.indicators);
			for (var i in indicators) {
				var data = indicators[i];
				data.icon = json.icon;
				data.icon_name = json.icon_name;
				var lonlat = new OpenLayers.LonLat(data.x, data.y);
				var marker = new AWP.Marker(lonlat, data);
				this.addMarker(marker);
			}
		// Basin 相关，点击首页位于 basin 重心处的 indicator 图标可触发此处代码
		} else {
			var indicators = AWP.createRecords(json);

			var obj = {};
			for (var i in indicators) {
				var row = indicators[i];
				if (!obj[row.basin]) {
					obj[row.basin] = {
						basin_name	: row.basin_name,
						icon_name	: row.icon_name,
						x			: row.x,
						y			: row.y,
						polygon		: row.polygon,
						indicators	: {}
					};
				}
				obj[row.basin].indicators[row.id] = row;
			}
			
			for (var basin in obj) {
				var data = obj[basin];
				var lonlat = new OpenLayers.LonLat(data.x, data.y);
				var marker = new AWP.Marker(lonlat, data);
				this.addMarker(marker);
			}
			
			this.indicator_data = obj;
			AWP.map.events.register('move', this, this.mapMoveEnd);
		}
		
		this.div.style.cursor = "pointer";
		this.events.triggerEvent("loadend");
	},
	mapMoveEnd: function() {
		var level = AWP.map.zoom - (AWP.cfg.defaultZoomLevel || AWP.map.defaultZoomLevel);
		
		var map			= AWP.map,
			center		= map.getCenter(),
			centerPx	= map.getLayerPxFromLonLat(center),
			boundsRect	= map.calculateBounds().scale(0.1).toGeometry();
		
//		this.f = new OpenLayers.Feature.Vector(boundsRect);
//		var layer = AWP.map.getLayerByName("Vector Features");
//		layer.removeAllFeatures();
//		layer.addFeatures([this.f]);
//		layer.setVisibility(true);
		
		var geomPoint	= new OpenLayers.Geometry.Polygon(center.lon, center.lat);
		var curMarkers	= [];
		for (var i = 0, len = this.markers.length; i < len; i++) {
			var marker = this.markers[i];
			// 如果与中心矩形框相交
			if (level >= 3 && marker.feature.geometry.intersects(boundsRect)) {
//				var bounds	= new OpenLayers.Bounds();
//				var px		= map.getLayerPxFromLonLat(marker.lonlat);
				var allContained = true;
				for (var j = 0, jlen = marker.icons.length; j < jlen; j++) {
					var icon	= marker.icons[j];
					var lonlat	= map.getLonLatFromLayerPx(centerPx.offset(icon.px));
					if (!marker.feature.geometry.containsPoint(new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat))) {
						allContained = false;
						break;
					}
					//alert(map.getLonLatFromLayerPx(new OpenLayers.Pixel(px.x, px.y)))
					//b.extend(map.getLonLatFromLayerPx(new OpenLayers.Pixel(px.x, px.y)));
					//bounds.extend(new OpenLayers.Geometry.Point(offset.x + px.x, offset.y + px.y));
				}
				if (allContained) {
//				//layer.addFeatures([new OpenLayers.Feature.Vector(b.toGeometry())]);
//				//centerPx.x -= 50;
//				//px.x += marker.lonlat.lon > center.lon ? bounds.getWidth() / 2 : -bounds.getWidth() / 2;
//				//px.y += marker.lonlat.lat > center.lat ? -bounds.getHeight() / 2 : bounds.getHeight() / 2;
					marker.moveTo(centerPx)
				}
			} else {
				var px = AWP.map.getLayerPxFromLonLat(marker.lonlat);
				marker.moveTo(px);
			}
		}
	},
	mapZoomChanged: function() {
		AWP.Layer.Markers.lastZoom = AWP.map.zoom;
	},
//	setVisibility: function(visibility) {
//		OpenLayers.Layer.Markers.prototype.setVisibility.apply(this, visibility);
//
//		if (AWP.map.googleEarth && AWP.map.googleEarth.ge) {
//			AWP.map.googleEarth.showIndicators(obj);
//		}
//	},
	aaa: function(event, indicator, placemark) {try{
		var ge = this.map.googleEarth.ge;
		// Prevent the default balloon from popping up.
		event.preventDefault();

		var balloon = ge.createHtmlStringBalloon('');
		balloon.setFeature(placemark);
		balloon.setMaxWidth(300);

		balloon.setContentString([
			'<table width="100%" cellpadding="0" cellspacing="0" border="0" style="height:100%">',
				'<tr>',
					'<td rowspan="3" width="60" align="center" valign="top">',
					'<img width="50" height="50" src="',
						AWP.cfg.SEAWA_ICON_URL, indicator.icon, '" /></td>',
					'<td colspan="2"><span style="font-size: 14px; font-family: Lucida Grande, Lucida Sans Unicode, Helvetica, Arial, sans-serif; font-weight: bold">',
					indicator.description,
					'</span></td>',
				'</tr>',
				'<tr>',
					'<td colspan="2"><span style="font-size: 10px; color: gray">', indicator.basin_name, '</span>',
					'<strong> - </strong>',
					'<span style="font-size: 10px; color: gray">', indicator.indicator, '</span></td>',
				'</tr>',
				'<tr>',
					'<td></td>',
					'<td align="right">',
					'<span style="font-size: 9px; color: silver">', indicator.date, '</span></td>',
				'</tr>',
			'</table>',
		].join(''));

		ge.setBalloon(balloon);}catch(e){alert(e)}
	},
	parseData2: function(ajaxRequest) {
        var text = ajaxRequest.responseText;

        var lines = text.split('\n');
        var fields, iconSize = new OpenLayers.Size(7, 7);
		var iconNoRealtime = 'image/marker-station-no-realtime.png';
		var iconRealtime = 'image/marker-station-realtime.png';

        for (var lcv = 0; lcv < (lines.length - 1); lcv++) {
            var currLine = lines[lcv].replace(/^\s*/,'').replace(/\s*$/,'');

            if (currLine.charAt(0) != '#') { /* not a comment */
                if (!fields) {
                    fields = currLine.split('\t');
                } else {
					var cols = currLine.split('\t');
					var data = {}, lonlat = new OpenLayers.LonLat(0, 0);
                    for (var i = 0; i < cols.length; i++) {
						var col = cols[i], field = fields[i];
						if (field == 'lat' || field == 'lon') {
							lonlat[field] = parseFloat(col);
						} else {
							data[field] = col.replace('\\t', '\t');
						}
					}
					if (data.aenv_stati) {
						data.icon = new OpenLayers.Icon(iconRealtime, iconSize);
					} else {
						data.icon = new OpenLayers.Icon(iconNoRealtime, iconSize);
					}

					var feature = new AWP.Feature(this, lonlat, data);
					this.addMarker(feature.createMarker());
					this.features.push(feature);
                }
            }
        }

		this.div.style.cursor = "pointer";
		this.events.triggerEvent("loadend");
    },
    CLASS_NAME: "AWP.Layer.Markers"
});

AWP.Layer.Markers.showRealtimeIndicatorLayers = function(tree) {
//	var cfgs = [{	name: 'Water Level',	layerId: 'water_level',		layers: 'water_level',
//		layerType: 'marker',
//		location: '?action=AWP.showRealtimeIndicator&format=json&layer=water_level',
//		category: 'real-time',				server: 3,					checked: false},
//	{	name: 'Flow',						layerId: 'flow',			layers: 'flow',
//		layerType: 'marker',
//		location: '?action=AWP.showRealtimeIndicator&format=json&layer=flow',
//		category: 'real-time',				server: 3,					checked: false},
//	{	name: 'Capacity',					layerId: 'capacity',		layers: 'capacity',
//		layerType: 'marker',
//		location: '?action=AWP.showRealtimeIndicator&format=json&layer=capacity',
//		category: 'real-time',				server: 3,					checked: false}];

	OpenLayers.Request.GET({
		url: AWP.cfg.serviceURL + '&action=listDefinedRealtimeIndicator',
		success: function(response) {
			try {
				var json = eval('(' + response.responseText + ')');
			} catch (e) {
				alert(e + '\n\n' + response.responseText);
				return
			}
			
			var result = AWP.createRecords(json);
			var layers = [], nodes = [];

			for (var i in result) {
				var indicator = result[i];
				var cfg = {
					name: indicator.name,
					layerId: indicator.name,
					layers: indicator.name,
					layerType: 'marker',
					location: AWP.cfg.serviceURL + '&action=showRealtimeIndicator&layer=' + indicator.field,
					category: 'real-time',
					server: 3,
					checked: false
				};
				
				var layer	= new AWP.Layer.Markers(cfg);
				var node	= new AWP.Layer.TreeNode(layer);
				layers.push(layer);
				nodes.push(node);
			}

			AWP.map.addLayers(layers);
			tree.getNodeById('realtime').appendChild(nodes);
		},
		failure: function() {
			alert('Failed to get real-time indicator information');
		},
		scope: this
	});
}
