
if (Object.isUndefined(PZDMap)) { var PZDMap = {conf:false, items:false} };
	
PbLib.module.load('loader');

//document.observe("dom:loaded", function() {
Event.observe(window, 'load', function() {
	if(PZDMap.conf) {
		PZDMap.conf = PZDMap.conf.evalJSON();
	}

	if(PZDMap.items) {
		PZDMap.items = PZDMap.items.evalJSON();
	}

	PZDMap.initialize();
});

/*
 * PZDMap
 */

PZDMap.initialize = function() {

	if (GBrowserIsCompatible())
	{

		//-------------------create map---------------
			var lat = PZDMap.conf.lat;
			var lng = PZDMap.conf.lng;

			var map = new GMap2(document.getElementById("map"));

			map.setCenter(new GLatLng(lat, lng), parseInt(PZDMap.conf.zoomlevel));

			if(PZDMap.conf.zoomlevel == 9) {
				map.disableDragging();
			}

			var mgr = new MarkerManager(map);

			this.mgr = mgr;
			this.map = map;

			var customUI = map.getDefaultUI();
			customUI.controls.scalecontrol = false;
			map.setUI(customUI);

		//-------------------zoom settings for map---------------

			G_PHYSICAL_MAP.getMinimumResolution = function () { return 9 };
			G_NORMAL_MAP.getMinimumResolution = function () { return 9 };
			G_SATELLITE_MAP.getMinimumResolution = function () { return 9 };
			G_HYBRID_MAP.getMinimumResolution = function () { return 9 };

			GEvent.addListener(map,'zoomend',function(oldLevel, newLevel){

				if(PZDMap.conf.useZoomlevels && PZDMap.conf.useZoomlevels == 1) {

					if(newLevel < oldLevel && newLevel < 9) {
						newLevel = 9;
						map.setZoom(newLevel);
					} else if (newLevel < oldLevel && newLevel > 9 && newLevel <12) {
						newLevel = 9;
						map.setZoom(newLevel);
					} else if (newLevel > 9 && newLevel <12) {
						//inzoomen
						newLevel = 12;
						map.setZoom(newLevel);
					}
				}

				if (newLevel >= 13) {
					map.setMapType(G_SATELLITE_MAP);
				} else if (newLevel > 9 && newLevel <= 12) {
					map.setMapType(G_PHYSICAL_MAP);
				}

				PZDMap.conf.zoomlevel = newLevel;

				if(newLevel == 9 && oldLevel != 9) {
					map.setCenter(new GLatLng(PZDMap.conf.centerLat, PZDMap.conf.centerLng), newLevel);
				}

				if(newLevel == 9) {
					map.disableDragging();
				} else {
					map.enableDragging();
				}

				if(PZDMap.conf.mode == 'full') {
					var bounds = PZDMap.map.getBounds();
					var Ne = bounds.getNorthEast();
					var Sw = bounds.getSouthWest();

					PZDMap.conf.bounds = {
						'maxLon' : Ne.x,
						'maxLat' : Ne.y,
						'minLon' : Sw.x,
						'minLat' : Sw.y

					}
					PZDMap.reloadObjects();
				}
			});

			if(PZDMap.conf.mode == 'full') {

				map.setMapType(G_PHYSICAL_MAP);

				//-------------------tile layer for zoomlevel 9---------------

					if(PZDMap.conf.useCustomMapOverlays) {
						PZDMap.addTileOverlay();
					}

				//----------------events on map--------------------

					GEvent.addListener(map, "dragend", function() {
						var bounds = PZDMap.map.getBounds();
						var Ne = bounds.getNorthEast();
						var Sw = bounds.getSouthWest();

						PZDMap.conf.bounds = {
							'maxLon' : Ne.x,
							'maxLat' : Ne.y,
							'minLon' : Sw.x,
							'minLat' : Sw.y

						}
						PZDMap.reloadObjects();
					});

				PZDMap.drawTypeList();
				PZDMap.drawRegionSelector();
				PZDMap.drawItems();
				$('searchfield').value = '';

			} else if (PZDMap.conf.mode == 'picker') {

				map.setMapType(G_NORMAL_MAP);

				map.disableDoubleClickZoom();

				GEvent.addListener(map, "click", function(overlay, latlng) {
					if (latlng) {
						PZDMap.drawPickerMarker(latlng.x, latlng.y);
					}
				});

				PZDMap.pickerCoordinates = {
					'lon'	: '',
					'lat'	: ''
				}

				if(PZDMap.conf.lat != '' && PZDMap.conf.lng != '') {
					PZDMap.pickerCoordinates.lon = PZDMap.conf.lng;
					PZDMap.pickerCoordinates.lat = PZDMap.conf.lat;
					PZDMap.drawPickerMarker(PZDMap.conf.lng, PZDMap.conf.lat)
				} else {
					map.setCenter(new GLatLng(51.6, 3.9), 9);
				}

				$('submitCoordinates').observe('click', function(event) {
					window.top.$('latitude').value = PZDMap.pickerCoordinates.lat.substr(0, 14);
					window.top.$('longitude').value = PZDMap.pickerCoordinates.lon.substr(0, 14);

					if(window.top.$('zoomlevelSnippet')) {
						window.top.$('zoomlevelSnippet').value = PZDMap.map.getZoom();
					}
					PbLib.destroyDialog();
				});
			} else if (PZDMap.conf.mode == 'seeker') {
				map.setMapType(G_PHYSICAL_MAP);
				if(PZDMap.conf.useCustomMapOverlays) {
					PZDMap.addTileOverlay();
				}
				PZDMap.drawItems();
			} else if (PZDMap.conf.mode == 'showItems') {
				map.setMapType(G_SATELLITE_MAP);
				if(PZDMap.conf.useCustomMapOverlays) {
					PZDMap.addTileOverlay();
				}
				PZDMap.drawItems();
			}
	}
}

PZDMap.addTileOverlay = function() {

	// Set up the copyright information
	// Each image used should indicate its copyright permissions
	var myCopyright = new GCopyrightCollection("© ");
	myCopyright.addCopyright(new GCopyright('PZD',
	  new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)),
	  0,'©2009'));

	// Create the tile layer overlay and
	// implement the three abstract methods
	var tilelayerZoom9 = new GTileLayer(myCopyright);

	tilelayerZoom9.getTileUrl = function(tile, zoom) {
		if (zoom == 9 && tile.x <= 263 && tile.x >= 259 && tile.y >= 168 && tile.y <= 171) {
			return PbLib.getNewURI("/files/mod_pzd/img/mapImages/x" + tile.x + "y" + tile.y +"z9.png");
		} else {
			if (zoom == 9) {
				return PbLib.getNewURI("/files/mod_pzd/img/mapImages/standard.png");
			} else {
				return "";
			}
		}
	};
	tilelayerZoom9.minResolution = function() {
		return 9;
	};
	tilelayerZoom9.maxResolution = function() {
		return 9;
	};
	tilelayerZoom9.isPng = function() {
		return true;
	};
	tilelayerZoom9.getOpacity = function() {
		return 1.0;
	}
	var TileLayerZoom9 = new GTileLayerOverlay(tilelayerZoom9);
	PZDMap.map.addOverlay(TileLayerZoom9);

}

PZDMap.drawPickerMarker = function(lon, lat) {
	PZDMap.mgr.clearMarkers();

	//point on map
	var point = new GLatLng(lat, lon);
	//make marker
	var marker = new GMarker(point, {draggable: true});

	GEvent.addListener(marker, "dragend", function() {
		var latlng = marker.getLatLng();
		PZDMap.pickerCoordinates.lon = latlng.x + '';
		PZDMap.pickerCoordinates.lat = latlng.y + '';
		$('selectedCoordinate').update(PZDMap.pickerCoordinates.lon.substring(0,4) + '/' + PZDMap.pickerCoordinates.lat.substring(0,4));
	});

	PZDMap.mgr.addMarker(marker, 9);
	PZDMap.mgr.refresh();
	PZDMap.pickerCoordinates.lon = lon + '';
	PZDMap.pickerCoordinates.lat = lat + '';
	$('selectedCoordinate').update(PZDMap.pickerCoordinates.lon.substring(0,4) + '/' + PZDMap.pickerCoordinates.lat.substring(0,4));
}

PZDMap.drawRegionSelector = function() {

	var regionSelector = new Element('div', {
		'id'	: 'regionSelector'
	}).insert('<h4>' + PbLib.g('Also show object of these regions:') + '</h4>');

	var ul = new Element('ul');
	regionSelector.insert(ul);

	var minimalOneRegion = false;
	$H(PZDMap.conf.regions).each(function(region) {

		var regionId = region.key;
		region = region.value;

		if(region.visible) {
			minimalOneRegion = true;
			var input = new Element('input', {
				'type' : 'checkbox'
			});
			input.regionId = regionId;

			input.observe('click', function(event) {
				PZDMap.changeRegionCheckbox(input);
			})

			var li = new Element('li').update(input).insert(region.title);
			if(region.selected) {
				input.checked = true;
			}
			ul.insert(li);
		}
	});

	if(minimalOneRegion) {
		$('visibility-selector').insert(regionSelector);
	}
}

PZDMap.resetImage = function(objectId) {
	if(PZDMap.drawedMarkers[objectId]) {
		PZDMap.drawedMarkers[objectId].setImage(PZDMap.pannedItem.probaseIcon + '24.png');
	}
}

PZDMap.drawItems = function() {

	var batch = [];
	var markers = {};

	PZDMap.items.each(function(item) {

		// icon
		var itemIcon = new GIcon();

		if(PZDMap.pannedItem && PZDMap.pannedItem.objectId == item.objectId) {
			itemIcon.image = PZDMap.conf.highlightIcon + '24.png';
		} else {
			itemIcon.image = item.icon + '24.png';
		}

		itemIcon.iconSize = new GSize(24, 24);
		itemIcon.shadowSize = new GSize(22, 20);
		itemIcon.iconAnchor = new GPoint(6, 20);

		markerOptions = { icon:itemIcon };

		//point on map
		var point = new GLatLng(item.lat, item.lng);

		//make marker
		var marker = new GMarker(point, markerOptions);
		marker.probaseIcon = item.icon;

		markers[item.objectId] = marker;

		// not if showitems because that is only for showing, not for getting data of an object
		if (PZDMap.conf.mode != 'showItems') {

			//click event
			GEvent.addListener(marker, "click", function() {

				if(PZDMap.pannedItem) {
					PZDMap.resetImage(PZDMap.pannedItem.objectId);
				}

				if(PZDMap.drawedMarkers) {
					PZDMap.pannedItem = marker;
					PZDMap.pannedItem.objectId = item.objectId;
					marker.setImage(PZDMap.conf.highlightIcon + '24.png');
				}

				PZDMap.showDataOfSingleObject(item.objectId);
				PZDMap.selectedObjectHtml = $('currentObject').innerHTML;
			});
		}

		//draw on map
		batch.push(marker);
	});
	
	//if mode == showItems -> show on all levels
	if(PZDMap.conf.mode == 'showItems') {
		PZDMap.mgr.addMarkers(batch, 9);
	} else {
		PZDMap.mgr.addMarkers(batch, PZDMap.conf.zoomlevel);
	}
	
	PZDMap.mgr.refresh();
	PZDMap.drawedMarkers = markers;
}

PZDMap.drawType = function(child, selected, upperLayer) {

	var childId = child.key;
	var child = child.value;

	var childLi = new Element('li');
	var childLiInput = new Element('input', {
		'type' : 'checkbox'
	});
	childLiInput.limeTypeName = childId;

	childLiInput.observe('click', function(event) {
		PbLib.startLoader('', event);
		PZDMap.changeCheckboxes(childLiInput, childLi);
	});

	childLi.insert(childLiInput);
	childLi.insert(new Element('img', {'src' : child.icon}));
	var childLabel = new Element('label').update(child.title);

	if (upperLayer) {
		childLi.observe('click', function(event) {

			if(!Object.isArray(child.children) && (Event.element(event) == childLabel || Event.element(event) == childLi)) {

				if(childLabel.up().hasClassName('open')) {
					childLabel.up().removeClassName('open');
					childLabel.up().addClassName('closed');

					var firstUl = childLabel.up().select('ul').first();
					if(firstUl) {
						childLabel.up().select('ul').first().setStyle({
							'display' : 'none'
						});
					}
				} else if (Event.element(event) == childLabel || Event.element(event) == childLi) {
					childLabel.up().addClassName('open');
					childLabel.up().removeClassName('closed');

					var firstUl = childLabel.up().select('ul').first();
					if(firstUl) {
						childLabel.up().select('ul').first().setStyle({
							'display' : ''
						});
					}
				}
			}
		});
	}

	if(PZDMap.conf.types[childId] == true || selected == true) {
		childLiInput.checked = true;
		PZDMap.conf.types[childId] = true;
		childLi.hasBeenChecked = true;
	} else {
		childLi.hasBeenChecked = false;
	}

	childLi.insert(childLabel);

	if(!Object.isArray(child.children)) {

		childLabel.addClassName('hasChildren');

		if(upperLayer) {
			childLi.addClassName('closed');
		}

		var childUl = new Element('ul');

		if(upperLayer) {
			childUl.setStyle({
				'display' : 'none'
			});
		}

		var allChildrenSelected = true;

		$H(child.children).each(function(subChild) {
			var childUlLi = PZDMap.drawType(subChild, PZDMap.conf.types[childId], false);
			childUl.insert(childUlLi);

			if(childUlLi.hasBeenChecked == false) {
				allChildrenSelected = false;
			}

		});

		if(allChildrenSelected && PZDMap.conf.types[childId] != true) {
			childLiInput.checked = true;
			PZDMap.conf.types[childId] = true;
		}

		childLi.insert(childUl);
	}

	return(childLi);
	
}

PZDMap.drawTypeList = function() {

	var objectTypeList = new Element('ul', {
		'class' : 'visibility-selector'
	});

	// for each category
	$H(PZDMap.conf.typeMapping).each(function(child) {
		objectTypeList.insert(PZDMap.drawType(child, false, true));
	});

	$('visibility-selector').insert(objectTypeList);
}

PZDMap.changeRegionCheckbox = function(regionInput) {

	if(regionInput.checked) {

		PZDMap.conf.regions[regionInput.regionId].selected = 1;

	} else {

		PZDMap.conf.regions[regionInput.regionId].selected = 0;
	}

	PZDMap.reloadObjects();
}

PZDMap.changeCheckboxes = function(typeInput, typeLi) {

	if(typeInput.checked) {
		typeLi.select('input').each(function(input) {
			input.checked = true;

			if(!Object.isUndefined(PZDMap.conf.types[input.limeTypeName])) {
				PZDMap.conf.types[input.limeTypeName] = true;
			}
		});

		if(typeLi.up().up()) {
			while(typeLi = typeLi.up().up()) {
				if((typeLi.tagName).toLowerCase() == 'li') {

					var mustBeChecked = true;
					typeLi.select('ul').first().select('input').each(function(input) {

						if(input.checked == false) {
							mustBeChecked = false;
						}
					});

					if(mustBeChecked) {
						var firstInput = typeLi.select('input').first();
						firstInput.checked = true;

						if(!Object.isUndefined(PZDMap.conf.types[firstInput.limeTypeName])) {
							PZDMap.conf.types[firstInput.limeTypeName] = true;
						}
					}
				} else {
					break;
				}
			}
		}

	} else {

		typeLi.select('input').each(function(input) {
			input.checked = false;

			if(!Object.isUndefined(PZDMap.conf.types[input.limeTypeName])) {
				PZDMap.conf.types[input.limeTypeName] = false;
			}
		});

		if(typeLi.up().up()) {
			while(typeLi = typeLi.up().up()) {
				if((typeLi.tagName).toLowerCase() == 'li') {
					var firstInput = typeLi.select('input').first();
					firstInput.checked = false;

					if(!Object.isUndefined(PZDMap.conf.types[firstInput.limeTypeName])) {
						PZDMap.conf.types[firstInput.limeTypeName] = false;
					}
				} else {
					break;
				}
			}
		}
	};

	PZDMap.reloadObjects();
}

PZDMap.changeFilter = function() {
	PZDMap.conf.filter = $('searchfield').value;
	PZDMap.reloadObjects();
}

PZDMap.reloadObjects = function() {

	//do ajax request
	var url = PbLib.getNewURI('l/pzd/map/change_selection');

	new Ajax.Request(url, {
		'parameters' : {
			'conf'		: Object.toJSON(PZDMap.conf)
		},
		'onSuccess': function(response) {

			response = response.responseText.evalJSON();

			//reload items on map
			if(response.items) {
				PZDMap.setItems(response.items);
			}

			//reload itemlist under map
			if(response.list) {
				PZDMap.setItemList(response.list);
			}
			PbLib.stopLoader();
		}
	});
}

PZDMap.setItems = function(items) {
	PZDMap.items = items;
	PZDMap.mgr.clearMarkers();
	PZDMap.drawItems();
}

PZDMap.panToItem = function(lon, lat, id) {

	if(PZDMap.pannedItem) {
		PZDMap.resetImage(PZDMap.pannedItem.objectId);
	}

	if(PZDMap.drawedMarkers) {
		PZDMap.pannedItem = PZDMap.drawedMarkers[id];
		PZDMap.pannedItem.objectId = id;
		PZDMap.drawedMarkers[id].setImage(PZDMap.conf.highlightIcon + '24.png');
	}

	if(PZDMap.map.getZoom() != 9) {
		PZDMap.map.panTo(new GLatLng(lat, lon));
	}

	PZDMap.showDataOfSingleObject(id);
}

PZDMap.showDataOfSingleObject = function(id) {

	if(!$('currentObject')) {
		var div = new Element('div', {
			'id'	: 'currentObject',
			'class'	: 'current-object'
		});

		$('pzdMapList').insert({
			'before'	: div
		});

	}

	//do ajax request
	var url = PbLib.getNewURI('l/pzd/map/get_object_data');
	new Ajax.Request(url, {
		parameters: {
			'objectId' : id
		},
		'onSuccess': function(response) {
			response = response.responseText.evalJSON();
			$('currentObject').update(response);
		}
	});
}

PZDMap.setItemList = function(itemlist) {
	if($('pzdMapList')) {
		$('pzdMapList').replace(itemlist);
	}
}