jQuery(
	function($) {

		// hide submit button
		$('#submitSearch').hide();

		// activate facility search
		(
			function() {
				var
					ajaxPostFix = 'ajax=1',
					delayTimer = null,
					delayTimeout = 300,
					$searchContainer = $('.article'),
					$searchForm = $('#search', $searchContainer),
					$mapContainer = $('#map', $searchForm),
					map = null,
					markers = null,
					handleSuccess =
						function(data, textStatus, xmlHttpRequest) {
							var $results = $('.results', $searchContainer);
							if (!$results.length) {
								$results = $('#folding');
							}
							$results.replaceWith(data);
							if (map) {
								showResultsOnMap();
							}
						},
					submitSearch =
						function(e) {
							e.preventDefault();
							$.ajax(
								{
									type: 'POST',
									url: $searchForm.attr('action'),
									data: $searchForm.serialize() + '&' + ajaxPostFix,
									success: handleSuccess
								}
							);
							return false;
						},
					triggerDelayedSubmit =
						function() {
							$searchForm.trigger('delayedSubmit');
						},
					delaySubmit =
						function(e) {
							if ('keyup' == e.type && 13 == e.which) { return false; }
							if (delayTimer) {
								clearTimeout(delayTimer);
							}
							delayTimer = setTimeout(triggerDelayedSubmit, delayTimeout);
							return true;
						},
					showResultsOnMap =
						function() {
							var
								accumulatedLongitudeLatitude =
									{
										latitude: 0,
										latitudeMax: -9999,
										latitudeMin: 9999,
										longitude: 0,
										longitudeMax: -9999,
										longitudeMin: 9999,
										count: 0
									},
								defaultLongitudeLatitude =
									{
										latitude: 0,
										longitude: 0,
										count: 0
									};

							markers.removeMarkers();

							$('.results li', $searchContainer)
								.each(
									function() {
										var
											o = $.extend({}, defaultLongitudeLatitude, $(this).metadata()),
											size = new OpenLayers.Size(39, 39),
											offset = new OpenLayers.Pixel(-(size.w/2), -size.h),
											icon =
												new OpenLayers.Icon(
													o.markerIcon,
													size,
													offset
												),
											marker,
											lonLat;

										accumulatedLongitudeLatitude.count += o.count;
										accumulatedLongitudeLatitude.latitude += o.latitude;
										accumulatedLongitudeLatitude.longitude += o.longitude;

										if (o.count) {
											accumulatedLongitudeLatitude.latitudeMax = Math.max(accumulatedLongitudeLatitude.latitudeMax, o.latitude);
											accumulatedLongitudeLatitude.latitudeMin = Math.min(accumulatedLongitudeLatitude.latitudeMin, o.latitude);
											accumulatedLongitudeLatitude.longitudeMax = Math.max(accumulatedLongitudeLatitude.longitudeMax, o.longitude);
											accumulatedLongitudeLatitude.longitudeMin = Math.min(accumulatedLongitudeLatitude.longitudeMin, o.longitude);

											lonLat =
												new OpenLayers.LonLat(o.longitude, o.latitude)
													.transform(
														new OpenLayers.Projection("EPSG:4326"),
														map.getProjectionObject()
													);
											marker = new OpenLayers.Marker(lonLat, icon);
											marker.efoLongitude = o.longitude;
											marker.efoLatitude = o.latitude;
											marker.events
												.register(
													'mousedown',
													marker,
													function(e){
														$.ajax(
															{
																type: 'POST',
																url: $searchForm.attr('action'),
																data:
																	$searchForm.serialize()
																		+ '&latitude=' + o.latitude
																		+ '&longitude=' + o.longitude
																		+ '&' + ajaxPostFix,
																success:
																	function(data) {
																		if ($('li', data).length) {
																			if (!marker.popup) {
																				marker.popup =
																					new OpenLayers.Popup(
																						null,
																						lonLat,
																						new OpenLayers.Size(160, 40),
																						data,
																						false
																					);
																				marker.popup.keepInMap = false;
																				marker.popup.closeOnMove = true;
																				marker.popup.autoSize = true;
																				map.addPopup(marker.popup);
																			} else {
																				marker.popup.show();
																			}
																			marker.popup.moveTo(new OpenLayers.Pixel(icon.px.x - 103, icon.px.y - (35 + marker.popup.size.h)));
																		}
																	}
															}
														);
													}
												);
											markers.addMarker(marker);
										}
									}
								);

							if (1 == accumulatedLongitudeLatitude.count) {
								map.setCenter(
									new OpenLayers.LonLat(
										accumulatedLongitudeLatitude.longitude / accumulatedLongitudeLatitude.count,
										accumulatedLongitudeLatitude.latitude / accumulatedLongitudeLatitude.count
									).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()),
									9
								);
							} else if (1 < accumulatedLongitudeLatitude.count && accumulatedLongitudeLatitude.latitudeMax != accumulatedLongitudeLatitude.latitudeMin) {
								map.zoomToExtent(
									new OpenLayers.Bounds(
										accumulatedLongitudeLatitude.longitudeMin,
										accumulatedLongitudeLatitude.latitudeMin,
										accumulatedLongitudeLatitude.longitudeMax,
										accumulatedLongitudeLatitude.latitudeMax
									).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject())
								);
							} else {
								map.zoomToExtent(new OpenLayers.Bounds(9.25, 53.5, 10.25, 54.5).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()));
							}
						};

				$mapContainer
					.each(
						function(i, element) {
							var
								o = $.extend({}, $(element).metadata()),
								ol_wms = new OpenLayers.Layer.WMS(
									'OpenLayers WMS',
									'http://labs.metacarta.com/wms/vmap0',
									{
										layers: 'basic'
									}
								),
								osm_mapnik = new OpenLayers.Layer.OSM.Mapnik('Mapnik');

							map =
								new OpenLayers.Map(
									$(element).attr('id'),
									{
										units: 'm',
										projection: new OpenLayers.Projection("EPSG:900913"),
										displayProjection: new OpenLayers.Projection("EPSG:4326")
									}
								);
							markers = new OpenLayers.Layer.Markers('Markers');
							markers.removeMarkers =
								function() {
									var
										markers = this.markers.slice(0),
										length = markers.length,
										i;

									for (i = 0; i < length; i++) {
										this.removeMarker(markers[i]);
									}

									return this;
								};

							map.addLayers([markers, osm_mapnik]);
							showResultsOnMap();
						}
					);


				$searchForm.bind('delayedSubmit', submitSearch);
				$('select', $searchForm).bind('change', delaySubmit);
				$('input[type=text]', $searchForm).bind('keyup', delaySubmit);
			}
		)();
	}
);
