function MapController(mapDiv, tableDiv) {
  var DEFAULT_ROUTING = 0;
  var DEFAULT_ROUTING_LABEL_TEXT = "Route berechnen";
  var DEFAULT_CENTERPOINT = new GLatLng(50.983397, 10.316849);
  var DEFAULT_MARKER_ICONS = "";
  var map = null;
  var mapContainer = null;
  var tableContainer = null;
  var routing = null;
  var routingLabelText = null;
  var centerPoint = null;
  var searchCenter = null;
  var searchService = null;
  var searchServiceType = null;
  var markerIcons = null;
  var ajaxURI = null;
  var zoom = 10;
  
  var mapController = function(mapOptions){
    mapContainer = mapOptions.mapContainer;
    tableContainer = mapOptions.tableContainer;
    searchCenter = mapOptions.searchCenter;
    searchService = mapOptions.searchService;
    searchServiceType = mapOptions.searchServiceType;
    ajaxURI = mapOptions.ajaxURI;
    routing = mapOptions.routing?mapOptions.routing:DEFAULT_ROUTING;
    routingLabelText = mapOptions.routingLabelText?mapOptions.routingLabelText:DEFAULT_ROUTING_LABEL_TEXT;
    markerIcons = mapOptions.markerIcons?mapOptions.markerIcons:DEFAULT_MARKER_ICONS;
  }

  this.init = function() {
    if (GBrowserIsCompatible()) {
      var iconFactoryInstance = IconFactory.getInstance();
      iconFactoryInstance.createIcons(markerIcons);
      var mapCenterPoint = getCenterPoint();      
    }
  }
  
  var initializeMap = function (zoomOut, forbidZoom, errorZoom) {
    var options = {resultList : G_GOOGLEBAR_RESULT_LIST_SUPPRESS,showOnLoad : true};
		map = new GMap2(document.getElementById(mapContainer), {googleBarOptions: options});
    map.addControl(new GSmallMapControl());
    var usedZoom = 10;
    if(zoomOut) {
    	usedZoom = zoom;
    }
    if(errorZoom) {
    	usedZoom = 6;
    }
    
    map.setCenter(centerPoint, usedZoom);
    var centerMarker = new GMarker(centerPoint);
    map.addOverlay(centerMarker);
    
    GEvent.addListener(map, 'moveend', function() {
			onMapChange(map);
		});
		canUseZoom = true;
		if(forbidZoom) {
			canUseZoom = false;
		}
		
		onMapChange(map, canUseZoom);
  }
  
  var getCenterPoint = function () {
  	if(searchCenter) {
  	  var geocoder = new GClientGeocoder();
  	  geocoder.setBaseCountryCode("de");
  		geocoder.getLatLng(searchCenter, function(Point) {
  		  if (!Point) {
  		    jQuery("#location_search_error").fadeIn().text("Der eingegebene Ort wurde nicht gefunden.");
  		    centerPoint = DEFAULT_CENTERPOINT;
					initializeMap(null, null, 1);
  		  } else {
  		    centerPoint = Point;
  		    initializeMap();
  		  }
  		});
  	} else {
  	  centerPoint = DEFAULT_CENTERPOINT;
  	  initializeMap(null, null, 1);
  	}
  }
  
  var onMapChange = function(canZoomOut) {
  	var bounds = map.getBounds();
    var north = bounds.getNorthEast().lat();
  	var east = bounds.getNorthEast().lng();
  	var south = bounds.getSouthWest().lat();
  	var west = bounds.getSouthWest().lng();
  	var locationFactoryInstance = LocationFactory.getInstance();
    locationFactoryInstance.updateLocationData(ajaxURI, north, east, south, west, searchService, searchServiceType, canZoomOut);
  }

  this.onDataChange = function(zoomOut, searchText) {
    map.clearOverlays();
    if(zoomOut && zoom > 0) {
      zoom -= 2;
      initializeMap(zoomOut);
      return;
    }
    if(searchText != ' ') {
      jQuery("#searchText").fadeIn().text(searchText);
    }
    var locationFactoryInstance = LocationFactory.getInstance();
  	var tableData = Location.createTableData();
  	var table = updateLocationTable(tableData);
  	markerManager = new MarkerManager(map);
  	markerManager.addMarkers(Marker.createMarkerArray(), 4);
  	markerManager.refresh();

  	jQuery('#locationList tbody tr td').click( function() {
  		var location = Location.findByID(jQuery(this).parent().data("locationID"));
  		var marker = location.getMarker().getGoogleMarker();
  		marker.openInfoWindowHtml(location.getInfoWindow());
  	});
  }
  
  var updateLocationTable = function(locationTableData) {
  	jQuery('#locationList').empty();
  	jQuery('#locationList_paginate').empty();
  	/*if(jQuery('#locationList').children('tr').children('td')) {
  	  var table = jQuery('#locationList').dataTable({});
  	  console.log(table);
	  }*/
  	//fnUpdate
  		var table = jQuery('#locationList').dataTable( {
        "bPaginate": true,
        "sPaginationType": "full_numbers",
        "bLengthChange": false,
        "bFilter": false,
        "bSort": true,
        "bInfo": false,
        "bAutoWidth": false,
        "aaSorting": [[ 5, "asc" ]],
  			"aaData": locationTableData,
  			"aoColumns": [
  				{ "sTitle": "Standort" },
  				{ "sTitle": "Straße" },
  				{ "sTitle": "PLZ" },
  				{ "sTitle": "Ort" },
  				{ "sTitle": "ID", "sClass": "center", "bVisible": false },
  				{ "sTitle": "Link zur Standortseite"}
  				//{ "sTitle": "Entfernung" },
  				//{ "sTitle": "Route" }
  			],
  			"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
  			  jQuery(nRow).data("locationID", aData[4]);
  				return nRow;
  			}
  		});
  		//console.log(locationTableData[0]);
  		//table.fnClearTable(0);
  		//table.fnUpdate(locationTableData);
  	//table.fnClearTable( 0 );
  	return table;
  }
  
  this.createRoutingLabel = function(target) {
    return '<a href="http://maps.google.de/?saddr=' + centerPoint.toUrlValue() + '&daddr=' + target.toUrlValue() + '" target="_blank">' + routingLabelText + '</a>';  
  }
  
  this.getCenterPoint = function() {
    return centerPoint; 
  }
  
  mapController(mapDiv, tableDiv);
}
