/* weitere Scripte includen */
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/contextmenucontrol_packed.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/markermanager_packed_v1.1.js\'>'+'</'+'sc'+'ript>\n');
/* new clusterer */
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/markerclusterer.min.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/halmap_cache.min.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/halmap_geosearch.min.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/hal2polygon.min.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/hal2marker.min.js\'>'+'</'+'sc'+'ript>\n');
document.write('<scr'+'ipt language=\'javascript\' src=\'/skripte/gmaps/kmlparser.min.js\'>'+'</'+'sc'+'ript>\n');
/**
 * verwendete globale Variablen
 *
 */
var iWidth = false;
var iHeight = false;
var jhalmap = null; // MAP
var halmarker = new Array(); // TODO: depricated
var halMarkerTxt = new Array();
var halMarkerManager = null;
var bikeMarker = new Array();
var mouseX;
var mouseY;
var lastMouseX; // diese werden bei rechtsclick gesetzt
var lastMouseY; // diese werden bei rechtsclick gesetzt
var mouseLat;
var mouseLon;
var debug = false;
var tooltip = false;
var contextmenu = null;
var i=1;
var stdIcon = new GIcon(G_DEFAULT_ICON);
/* Default-Marker, der ggf. auf der Map bewegt/umgesetzt werden kann */
var defaultMarker = null;
var dmarker = null; // draggable marker
/* CallBike-Icon */
var bikeIcon = false;
/* Cluster */
var halMarkerClusterer = false;

/* befinden wir uns im Popup */
var isPopup = false;
var tmpBounds = false;
/**
 * simplen Marker erstellen
 * via ajax + JSON-Rückgabe
 * @param options - Optionen-Object
 */
var hal2Icon = false;
var _marker = [];
/* Speicherort f. Moveend-Eventhandler loadmarker */
var G_HALMAP_MOVEEND_EVENT_LOADMARKER = null;
/* GeoCoder */
var hal2GeoCoder = new GClientGeocoder();

function createBikeIcon(m_icon, shadow_icon) {
  if(false == bikeIcon) {
    bikeIcon = new GIcon(G_DEFAULT_ICON);
    bikeIcon.image = m_icon;
    bikeIcon.shadow = m_icon; //"http://branch-google.siggi.it.hal.dbrent.net/resourcen/map_icons/fahrrad_shadow.png";
    bikeIcon.iconSize = new GSize(21, 26);
    bikeIcon.shadowSize = new GSize(22, 20);
    bikeIcon.iconAnchor = new GPoint(6, 20);
    bikeIcon.infoWindowAnchor = new GPoint(5, 5);
  }
  return bikeIcon;
}
/**
 * Positions-Daten
 */
function setMousePosition(latLon)
{
  mouseX = latLon.x;
  mouseY = latLon.y;
  // point = jhalmap.setPoint();
  if(debug == true) {
    var divObj = parent.document.getElementById('loader');
    divObj.innerHTML = 'Debug: '+mouseX+' - '+mouseY;
  }
}
function resetMarker()
{
  halmarker = new Array();
  halMarkerTxt = new Array();
  halMarkerManager = null;
  stationMarker = new Array();
  stadtMarker = new Array();
  bikeMarker = new Array();
}

function resetTmpBounds() { tmpBounds = false; }

function createBikeMarker(m_x, m_y, m_icon, m_text, m_function, m_id, shadow_icon, extendBound)
{
  if(bikeMarker[m_id]) {jhalmap.removeOverlay(bikeMarker[m_id]);}
  if(tmpBounds == false) {tmpBounds = new GLatLngBounds();}
  if(extendBound == 1) { tmpBounds.extend(new GLatLng(m_y,m_x)); }

  bikeMarker[m_id] = new GMarker(new GPoint(m_x, m_y), createBikeIcon(m_icon, shadow_icon));
  bikeMarker[m_id].bindInfoWindowHtml(m_text);
  jhalmap.addOverlay(bikeMarker[m_id]);
}

function zoomToLatLngAndLevel(zoomLvl, centerLatLng) {
  if(zoomLvl == false) {
    zoomLvl = jhalmap.getBoundsZoomLevel(tmpBounds);
  }
  if(typeof centerLatLng == 'object') {
    jhalmap.setCenter(centerLatLng,zoomLvl);
  }
  jhalmap.setZoom(zoomLvl);
  // aktZoom = jhalmap.getZoom();
  var i = 0;
  // alert('zoomto: '+zoomLvl);
  // fallback, da es irgendwie buggt
  while(zoomLvl != jhalmap.getZoom() && i < 10) {
    jhalmap.zoomIn();
    i++;
  }
}

function zoomTo(p1,p2,p3)
{
  // reset
  tmpBounds = new GLatLngBounds();
  if(typeof p1 == 'object') {tmpBounds.extend(p1);}
  if(typeof p2 == 'object') {tmpBounds.extend(p2);}
  if(typeof p3 == 'object') {tmpBounds.extend(p3);}
  zoomToTmpBounds(false);
  jhalmap.setCenter(p1);
}

function zoomToTmpBounds(zoomLvl)
{
  if(zoomLvl == false) {
    zoomLvl = jhalmap.getBoundsZoomLevel(tmpBounds);
  }
  jhalmap.setZoom(zoomLvl);

}

function createDragableMarker(m_x, m_y, m_icon, m_text, dragendfunc)
{
  if(dmarker) {jhalmap.removeOverlay(dmarker);}
  dmarker = new GMarker(new GPoint(m_x, m_y), {draggable: true});

  GEvent.addListener(dmarker, "dragstart", function() {
                       jhalmap.closeInfoWindow();
                     });

  if(dragendfunc != '' && dragendfunc != undefined) {
    GEvent.addListener(dmarker, "dragend", function() {
                         eval(dragendfunc);
                       });
  } else {
    GEvent.addListener(dmarker, "dragend", function() {
                         setKoordsByMarker('id_x_koord','id_y_koord', 'dmarker');
                       });
  }
  if(m_text != '') {
    dmarker.bindInfoWindowHtml(m_text);
  }
  jhalmap.addOverlay(dmarker);
}

/**
 * alle Marker wieder entfernen
 * wird vornehmlich bei der Bikesuche in hal verwendet 
 */
function mapReset(marker_namespace)
{
    remove_hal2marker(marker_namespace);
}

/**
 * Marker + Polygons verstecken
 * @param string  -   Objectname, wie er im Polygon-cache verwendet wird
 */
function hide_hal2polygons_and_hal2marker(objectname){
    hide_hal2polygons(objectname);
    hide_hal2marker(objectname);
    if(arguments.length > 1 && arguments[1] != null){
        hideMarkerClusterer(arguments[1]);
    }
}
/**
 * Marker + Polygons anzeigen
 * @param string  -   Objectname, wie er im Polygon-cache verwendet wird
 * @param srting  -   Clustername, wenn auch cluster entfernt werden sollen
 */
function show_hal2polygons_and_hal2marker(objectname){
    show_hal2polygons(objectname);
    show_hal2marker(objectname);
    if(arguments.length > 1 && arguments[1] != null){
        showMarkerClusterer(arguments[1]);
    }
}
/**
 * Checkboxen zum filtern der Markerdarstellung
 * @see show_hal2marker, @see hide_hal2marker
 */
function init_gmap_filter()
{
	jQuery.log('mapfilter');
    jQuery('.jq-mapfilter').click(function(){
    	jQuery.log('mapfilter clicked: '+_filter);
        var _filter = jQuery(this).attr('id');
        var _filterChecked = jQuery(this).prop('checked');
        jQuery.log('mapfilter clicked: '+_filter+' = '+_filterChecked);
        var _clustername = null;
        switch(_filter){
        	case 'staedtefilter':
        	   _objectname = 'stadtmarker';
        	   _function = 'hal2marker';
        	break;
        	case 'stationfilter':
               _objectname = 'halmarker';
               _function = 'hal2marker';
            break;
            case 'buchmarker':
                _objectname = 'buchmarker';
               _function = 'hal2marker';
               _clustername = 'buchcluster';
            break;
            case 'ecarfilter':
                _objectname = 'elektromarker';
               _function = 'hal2marker';
            break;
            case 'fahrzeugfilter':
               _objectname = 'automarker';
               _function = 'hal2marker';
               _clustername = 'autocluster';
            break;
            case 'parkraumfilter':
               _objectname = 'virtuell';
               _function = 'hal2polygons_and_hal2marker';
               _clustername = 'autocluster';
            break;
        };
        if(_filterChecked){
           eval('show_'+_function+'(\''+_objectname+'\',\''+_clustername+'\')');
        }else{
           eval('hide_'+_function+'(\''+_objectname+'\',\''+_clustername+'\')');
        }
    });    
};
/**
 * Filterformular entspr. der Visibility setzen
 * @param
 */
function check_filter_form() {
    jQuery('.jq-mapfilter').each(function(){
       var _objectname = jQuery(this).data('objectname');
       var _objecttyp = jQuery(this).data('objecttyp');
       switch(_objecttyp){
       	case 'hal2marker':
           if(typeof G_HAL2MARKER_FILTER == 'object' && null != G_HAL2MARKER_FILTER){
                for(test in G_HAL2MARKER_FILTER){       
                    if(_objectname == test){
                        if(G_HAL2MARKER_FILTER[test].visible == false){
                            jQuery(this).prop('checked',false);
                        }else{
                            jQuery(this).prop('checked',true);
                        }
                    }
                }
           }
        break;
        case 'hal2polygon':
            // TODO:
        break;
       }
    });
};
/**
 * erstellt hal2marker
 * @param float     x-Koordinate
 * @param float     y-Koordinate
 * @param string    object-Name des Icon-Objects
 * @param string    tooltip
 * @param int       minZoom
 * @param int       maxZoom
 * @param string    Functionsname der beim click-Event aufgerufen wird
 *                  als Funktions-parameter wird wird das hal2marker-Object übergeben
 * @param string    DEPRICATED                 
 * @param string    DEPRICATED
 * @param string    DEPRICATED
 * @param string    DEPRICATED
 * @param boolean   true/false
 * @param object    Optionen als Javascript-Objektliteral {}
 */
function createHAL2Marker(m_x, m_y, m_icon, m_id, tooltip, minZoom, maxZoom, EventClick, EventDblClick, EventMOver, EventMOut, EventRClick, isDraggable, addOptions)
{
  /* DEPRICATES
  if(typeof halmarker[m_id] == 'object' && halmarker[m_id] != null) {
  	return false; 
  }  
  */
  if('false' == m_x){
    // Random
  	var bounds = jhalmap.getBounds();
  	var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    var lngSpan = northEast.lng() - southWest.lng();
    var latSpan = northEast.lat() - southWest.lat();
  	var latlng = new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random());  	
  }else{
    var latlng = new GLatLng(m_y,m_x)
  }
  
  iconObj = eval(m_icon);
  if(false == addOptions){ addOptions = {}; }
  /**/
  var _opts = jQuery.extend({icon: iconObj
            ,draggable: isDraggable
            ,no_marker: false
            ,objectname: 'Hal2Marker'
            ,tooltip: tooltip
            ,hide: false
            ,mouseover: 'showTooltip'// function(latlng){jQuery.log('hal2marker custom mouseovered'+(typeof that)+' - '+latlng.lat()+'/'+latlng.lng());}
            ,mouseout: 'hideToolTip' //function(latlng){jQuery.log('hal2marker custom mouseouted'+(typeof that)+' - '+latlng.lat()+'/'+latlng.lng());}
            ,click: EventClick
            ,openinfo: null
            ,minZoom: minZoom
            ,maxZoom: maxZoom
            ,id: m_id
            ,popup: isPopup
            ,clustername: false // wenn != false, dann zum cluster mit diesem Namen hinzufuegen
            },addOptions);
  /**
   * aus einer Marker-Position soll nur das Polygon erstellt werden, der Marker wird übersprungen
   * z.B. virtuelle Stationen mit KML-Files(Flinkster - München)
   */
  if(typeof _opts.kml_file == 'string' && _opts.no_marker != false){
    return createHAL2Polygon(_opts.kml_file,jhalmap,_opts);
  }
  var _marker = new hal2Marker(latlng, _opts);
  
  if(false !== _marker){
      if(_marker.hal2options.clustername != false){
        addMarkerToClusterer(_marker);
      }else{
        addMarkerToManager(_marker);  
      }  
  }
};
/**
 * Polygone erstellen
 * @param   string  -   Pfad zum KML-File
 * @param   object  -   GMap
 * @param   object  -   Javascript-Objectliteral mit Optionen, @see HAL2Polygon
 */
function createHAL2Polygon(kmlfile,map,opts){	
	var options = jQuery.extend({},opts);
    var poly = new kmlParser(kmlfile,map,options);
    return poly;
};

/**
 * Hiermit wird bei einem Stadtmarker-Click auf die nächste Zoomstufe der
 * Stadt herangezoomed - das ist quasi der Ballungsgebiete-Hack, wo man einfach näher heranzoomed,
 * um die Staedtemarker voneinander unterscheiden zu können
 * - wenn die Zoomstufe bereits erreicht:
 *   -> dann wird nur auf den Marker zentriert
 * - wenn die Zoomstufe+1 > aktueller Zoomstufe:
 *   -> wenn eine openInfoWindow-Function definiert ist, wird diese aufgerufen
 * @param   hal2marker
 */
function stadtclick(m){
	if(false == m.hal2options.maxZoom) {
	   return false;
	}	
	// jQuery.log('zoom: '+jhalmap.getZoom()+' < '+m.hal2options.maxZoom+' - '+m.getLatLng());    
    if(jhalmap.getZoom() < m.hal2options.maxZoom){
        jhalmap.setCenter(m.getLatLng(),Number(m.hal2options.maxZoom));        
    }else if((Number(m.hal2options.maxZoom)+1) != jhalmap.getZoom()){
        jhalmap.setCenter(m.getLatLng(),Number(m.hal2options.maxZoom)+1);
    }else{
        if(typeof m.openInfoWindow == 'function'){
            m.openInfoWindow();
        }else{
            jhalmap.setCenter(m.getLatLng(),jhalmap.getZoom());
        }
    }
};
/* zum Marker mit fester Zoomstufe 12 zoomen
 * @param   object  hal2marker
 */
function zoomToCityMarker(m1) {
  var lvl = 12;
  if(typeof m1 == 'object' && typeof jhalmap == 'object') {
    m1.zoomTo(jhalmap,lvl);
  }
};

var filterhandler = function(){
    jQuery.log('moveend triggert -> markerfilter');
    if(typeof G_HAL2MARKER_FILTER == 'object' && null != G_HAL2MARKER_FILTER){
        jQuery.log('habe global markerfilter '+typeof G_HAL2MARKER_FILTER);
        for(test in G_HAL2MARKER_FILTER){
            jQuery.log('filter: '+test);
            if(typeof test == 'string' && typeof G_HAL2MARKER_CACHE[test] == 'object' && null != G_HAL2MARKER_CACHE[test]){
                if(false == G_HAL2MARKER_FILTER[test].visible){ 
                    hide_hal2marker(test);
                }
                else{
                    show_hal2marker(test);
                }
            }
        };
        check_filter_form();
    }
};
/**
 * erstellt einen Eventhandler, wenn die karte verschoben/gezoomed wird
 * wodurch die Filter in G_HAL2MARKER_FILTER ausgewertet werden
 * der Listener wird in der globalen Variable G_HAL2MARKER_FILTER_HANDLER gespeichert
 * und kann via remove_markerfilter_handler() wieder entfernt werden
 */
function create_markerfilter_handler(){
    if(typeof G_HAL2MARKER_FILTER_HANDLER != 'object' || null == G_HAL2MARKER_FILTER_HANDLER){
        G_HAL2MARKER_FILTER_HANDLER = GEvent.addListener(jhalmap,'moveend',filterhandler);
    }
    if(typeof G_HAL2MARKER_FILTER_OVERLAY_HANDLER != 'object' || null == G_HAL2MARKER_FILTER_OVERLAY_HANDLER){
        G_HAL2MARKER_FILTER_OVERLAY_HANDLER = GEvent.addListener(halMarkerManager,'changed',filterhandler);
    }
};
/**
 * entfernt den in create_markerfilter_handler erstellten
 * event-listener
 */
function remove_markerfilter_handler(){
    if(typeof G_HAL2MARKER_FILTER_HANDLER == 'object' && null != G_HAL2MARKER_FILTER_HANDLER){
        GEvent.removeListener(G_HAL2MARKER_FILTER_HANDLER);
    }
    if(typeof G_HAL2MARKER_FILTER_OVERLAY_HANDLER == 'object' && null != G_HAL2MARKER_FILTER_OVERLAY_HANDLER){
        GEvent.removeListener(G_HAL2MARKER_FILTER_OVERLAY_HANDLER);
    }
};
/**
 * Hinweis/Hint anzeigen
 * setzt eine entspr. DOM-Element mit id='hintdiv' voraus
 * @param   string
 */
function showHint(hint) {
  var hintDiv = parent.document.getElementById('hintdiv');
  if(hintdiv) {
    hintDiv.innerHTML = hint;
  }
};
/* öffnet über dem Marker ein InfoWindow Text wird entspr. übergeben
 * @param   int     ID des markers @see hal2marker.hal2options.id
 * @param   string  array-key des G_HAL2MARKER_CACHE
 */
function showMarker(id, objectname) {
    if(typeof G_HAL2MARKER_CACHE[objectname]['mark-'+id] == 'object') {
      G_HAL2MARKER_CACHE[objectname]['mark-'+id].zoomTo(jhalmap);
      openDynamicInfoWindow(G_HAL2MARKER_CACHE[objectname]['mark-'+id]);
    }
};
/* Bitte warten ein-/aus-blenden */
function setLoader(text) {
  var loadObj = parent.document.getElementById('loader');
  if(loadObj) {
    loadObj.innerHTML = text;
  }
};

/**
 * User-ToolTip on Mouseover
 * @param   object  Hal2Marker
 */
function showTooltip(marker) {
  if(marker.tooltip.toString() == 'false'){ return false; }  
  
  if(marker.tooltip == 'G_MARKER_ADDRESS'){
  	marker.getAddress();
    marker.tooltip = marker._address;    
  }
    
  tooltip.innerHTML = '<div class="tooltip">'+marker.tooltip+'</div>';
  var width = 20;
  var width2 = 25;
  var height2 = 45;
  if(typeof marker.getPoint == 'function') {
      var point = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(jhalmap.getBounds().getSouthWest(),jhalmap.getZoom());
      var offset = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),jhalmap.getZoom());
      var anchor = marker.getIcon().iconAnchor;
      width = parseInt(marker.getIcon().iconSize.width);
      width2 = (width+parseInt(offset.x)-parseInt(point.x)-parseInt(anchor.x));
      height2 =(parseInt(point.y)+parseInt(anchor.y)-parseInt(offset.y));
  } else {
    if(arguments.length == 2 && typeof arguments[1] == 'object') {
        tPoint = arguments[1];
        var point = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(jhalmap.getBounds().getSouthWest(),jhalmap.getZoom());
        var offset = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(tPoint,jhalmap.getZoom());
        var anchor = {x:0,y:0};
        width2 = (width+parseInt(offset.x)-parseInt(point.x)-parseInt(anchor.x));
        height2 =(parseInt(point.y)+parseInt(anchor.y)-parseInt(offset.y));
    }
  }
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(width2,height2));
  pos.apply(tooltip);
  tooltip.style.visibility="visible";
};
/**
 * Helper-Funktion um die boundaries der aktuellen Map zu ermitteln
 * wird via context-Menu gesteuert
 */
function setMapBounds()
{
  var mapBounds = jhalmap.getBounds();

  var min = mapBounds.getSouthWest();
  var max = mapBounds.getNorthEast();

  var textFeld = xajax.$('querybox');    
    if(textFeld == null) {
        var parentObj = document.getElementsByTagName('body');
        var textFeld = document.createElement('div');
        textFeld.id = 'querybox';
        parentObj[0].appendChild(textFeld);      
    }
  var query = 'min_x: '+min.lng()+'<br />max_x: '+max.lng()+'<br />min_y: '+min.lat()+'<br />max_y: '+max.lat();

  textFeld.innerHTML = query;
};
/**
 * Tooltip verbergen
 */
function hideToolTip() {
  tooltip.style.visibility="hidden";
};

function Loader() {
  this.showLoading = function(){var test1 = 'test1';}
  this.hideLoading = function(){var test1 = 'test2';}
};
/* Anzeige des "Bitte warten..." Textes */
function showLoading() {
  loader.innerHTML = '<div class="tooltip"><img src="/resourcen/map_icons/waiting.gif" border="1"><br />Bitte warten...</div>';
  var point = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(jhalmap.getBounds().getSouthWest(),jhalmap.getZoom());
  var offset = jhalmap.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),jhalmap.getZoom());
  var anchorCenter = jhalmap.getCenter(); // returns GLatLng
  var anchor = new GPoint(anchorCenter.lat,anchorCenter.lng);
  var width = 100;
  var width2 = 100;
  var height2 = 100;
  var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(width2,height2));
  pos.apply(loader);
  loader.style.visibility = 'visible';
};
function hideLoading() {
  //this.loader.style.visibility = 'hidden';
  //this.loader.style.display = 'none';
};

function setCenterKoordsTo(xTag,yTag) {
  var xTagObj = parent.document.getElementById(xTag);
  var yTagObj = parent.document.getElementById(yTag);
  var zoomTagObj = parent.document.getElementById('max_zoom');  
  if(typeof xTagObj == 'object' && typeof yTagObj == 'object') {
    var centerP = jhalmap.getCenter();
    var cLat = centerP.lat();
    var cLng = centerP.lng();
    xTagObj.value = cLng;
    yTagObj.value = cLat;
  }
  
  if(null != zoomTagObj && typeof zoomTagObj == 'object') {
    var aktZoom = (jhalmap.getZoom()-1);
    zoomTagObj.value = aktZoom;    
  }
  setMapBreite(jhalmap);
};
/**
 * Breitenangaben f. Speicherung der Stadt-Map-Eigenschaften
 * @see stadtplandienst.php
 * @param GMap
 */
function setMapBreite(map)
{
    if(typeof map == 'object')
    {
        var breiteXObj = parent.document.getElementById('breite_x');
        var breiteYObj = parent.document.getElementById('breite_y');
        var bounds = map.getBounds();
        jQuery.log('bounds: '+bounds); // debug
        var ne = bounds.getNorthEast();
        var sw = bounds.getSouthWest();
        var hoehe = Math.round(ne.distanceFrom(new GLatLng(ne.lat(),sw.lng())));
        var breite = Math.round(ne.distanceFrom(new GLatLng(sw.lat(),ne.lng())));
        jQuery.log('hoehe: '+hoehe+' breite: '+breite); // debug      
        if(null != breiteXObj && typeof breiteXObj == 'object') {
            breiteXObj.value = breite;    
        }
        if(null != breiteYObj && typeof breiteYObj == 'object') {
            breiteYObj.value = hoehe;
        }
    }
};
function setMapTypeTo(typeTag) {
  GEvent.addListener(jhalmap,'maptypechanged',function() {     
                var mname = jhalmap.getCurrentMapType().getName();                
                switch(mname) {
                    case 'Hybrid':
                        xajax.setVal(typeTag,'hybrid');
                    break;
                    case 'Satellit':
                        xajax.setVal(typeTag,'aero');
                    break;
                    case 'Karte':
                    default:
                        xajax.setVal(typeTag,'karte');
                    break;                    
                }
     });
  if(typeof jhalmap == 'object' && typeof jhalmap.getCurrentMapType() == 'object') {
     
  }
};
/**
 * Adress-Info-Window   
 * hiermit werden Adressinformationen zu einer Markerposition in einem InfoWindow angezeigt
 * @param   object  Hal2Marker
 */
function openAddressInfoWindow(m)
{
  var options = {adress:true,latlon:true,status:true,request:true,accuracy:true,country:true};
  if(typeof jQuery == 'function' && arguments.length > 1)
  {
     options = jQuery.extend(options,arguments[1]);
  }
    geocoder = new GClientGeocoder();
    var p = m.getLatLng();
    geocoder.getLocations(p, function(response) {
        if (!response || response.Status.code != 200) {
            text = 'Es konnten keine Adressinformationen ermittelt werden!';
        } else {
            place = response.Placemark[0];
            var text = '<p class="boxtxt">&nbsp;</p><p class="boxtxt">';
            if(options.latlon){
                text += '<b>Koordinaten(lat,lng):</b> ' + response.name + '<br />';
            }
            if(options.status) {
                text += '<b>Status Code:</b> ' + response.Status.code + '<br />'; 
            }
            if(options.request){
                text += '<b>Status Request:</b> ' + response.Status.request + '<br />';
            }
            if(options.adress) {
                text += '<b>Adresse:</b> ' + place.address + '<br />';
            }
            if(options.accuracy){
                text += '<b>Genauigkeit:</b> ' + place.AddressDetails.Accuracy + '<br />';
            }
            if(options.country){
                text += '<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode;
            }
            /* Buchungsanfrage f. die Koordinaten */
            if(options.brequest){
                text += '<a class="stdLink" href="/kundenbuchung/process.php?proc=buchanfrage_erg&amp;geo_latitude='+m.getLatLng().lat()+'&amp;geo_longitude='+m.getLatLng().lng()+'">Freie Fahrzeuge suchen</a>';
            }
            text += '</p>';            
        }
        m.openInfoWindowHtml(text);
    });
};

function setCenterByMarker(markerObj) {
  var cm = eval(markerObj);
  if(cm) {
    jhalmap.panTo(cm.getLatLng());
  }
  if(contextmenu) {
    contextmenu.style.visibility='hidden';
  }
}

/**
 * abgespeckte version mit reduzierten optionen
 * hiermit werden Adressinformationen zu einer Markerposition in einem InfoWindow angezeigt
 * wrapper f. openAddressInfoWindow 
 * @param   object  Hal2Marker
 */
function openAddressInfoWindow2(m)
{
	var opts = {adress:true,latlon:false,status:false,request:false,accuracy:false,country:false,brequest:false};
	if(arguments.length > 1 && typeof arguments[1] == 'object' && arguments[1] != null){
        opts = jQuery.extend(opts,arguments[1]);
	}
	opts.brequest = m.hal2options.brequest;
    openAddressInfoWindow(m,opts);
};
/**
 *  Polygone
 *  DEPRICATED: @see hal2polygon.js
 *  wird aktuell noch v. Call A Bike verwendet - Kerngebiete
 */
var COLORS = [["red", "#ff0000"], ["orange", "#ff8800"], ["green","#008000"],
              ["blue", "#000080"], ["purple", "#800080"]];
var DrawingOptions = {};
var lineCounter_ = 0;
var shapeCounter_ = 0;
var markerCounter_ = 0;
var colorIndex_ = 0;
var featureTable_;
var polys = []; // Welche Polygone haben wir schon
/**
 * random-Color, oder nach name z.B. 'red'
 */
function getColor(named) {
  return COLORS[(colorIndex_++) % COLORS.length][named ? 0 : 1];
};
function startShape() {
  var color = getColor(false);
  var polygon = new GPolygon([], color, 2, 0.7, color, 0.2);
  startDrawing(polygon, "Shape " + (++shapeCounter_), function() {
    var cell = this;
    var area = polygon.getArea();
    cell.innerHTML = (Math.round(area / 10000) / 100) + "km<sup>2</sup>";
  }, color);
};
function resetShape() {
  // polys entfernen
  for(var i=0;i<polys.length;i++)
  {
    jhalmap.removeOverlay(polys[i]);
  }
};
function startDrawing(poly, name, onUpdate, color) {
  jhalmap.addOverlay(poly);
  poly.enableDrawing(DrawingOptions);
  poly.enableEditing({onEvent: "mouseover"});
  poly.disableEditing({onEvent: "mouseout"});
  GEvent.addListener(poly, "endline", function() {
    // var cells = addFeatureEntry(name, color);
    // GEvent.bind(poly, "lineupdated", cells.desc, onUpdate);
    GEvent.addListener(poly, "click", function(latlng, index) {
      if (typeof index == "number") {
        poly.deleteVertex(index);
      } else {
        var newColor = getColor(false);
        // cells.color.style.backgroundColor = newColor
        poly.setStrokeStyle({color: newColor, weight: 4});
      }
    });
  });
};
function CreatePolygon(pts) {  
  if(typeof jQuery != 'function' || jQuery == null) { alert('Function \'CreatePolygon\' needs jQuery'); return false; }
    // GPolygon(latlngs, strokeColor?, strokeWeight?, strokeOpacity?, fillColor?, fillOpacity?, opts?)
    var defaultOptions = {strokeColor: '#000000',strokeWeight: '1', strokeOpacity: '1', fillColor: '#FFFF33', fillOpacity: '0.3',poly_name: '',poly_id: ''};
    var options = defaultOptions;
    if(arguments.length == 2 && typeof arguments[1] == 'object') {
        options = jQuery.extend(defaultOptions,arguments[1]);
    }
    var poly = new GPolygon(pts
                           ,options.strokeColor
                           ,options.strokeWeight
                           ,options.strokeOpacity
                           ,options.fillColor
                           ,options.fillOpacity
                           );
    
    // poly.tooltip = '<div class="tooltip">'+options.poly_name+'</div>';
    poly.tooltip = options.poly_name;
    poly.myName = options.poly_name;
    poly.myId = options.poly_id;
    /*                                                    
    GEvent.addListener(poly, "click", function() {        
        setTimeout(function(){jhalmap.setZoom(12);},200);
        setTimeout(function(){jhalmap.setCenter(poly.getBounds().getCenter());},200); 
    });
    poly.zoomIn = function(){
        setTimeout(function(){jhalmap.setZoom(12);},200);
        setTimeout(function(){jhalmap.setCenter(poly.getBounds().getCenter());},200);
    };
    GEvent.addListener(poly,'mouseover',function(){
        var point = poly.getBounds().getCenter();
        showTooltip(poly,point);
        inPolys = true;
    });    
    GEvent.addListener(poly,'mouseout',function(){hideToolTip();});
    */     
    polys.push(poly);       
    return poly;
};
function toggleKerngebietAuswahl()
{
    var kgObj = jQuery('#kerngebietSwitch');
    var forceShow = false;
    if(arguments.length == 1)
    { 
         forceShow = arguments[0]; 
         if(forceShow) {
             kgObj.removeClass('hidden');
         }else{	   
             kgObj.addClass('hidden');
         }
    }
    else
    {
        if(kgObj.hasClass('hidden')){
          kgObj.removeClass('hidden');
        }else{
          kgObj.addClass('hidden');
        }
    }
};
var kerngebietBounds = []; // wir sammeln mal die Bounds der Kerngebite auf
function showKerngebiet()
{
  var show = false;
  if(arguments.length == 1 && typeof arguments[0] == 'object')
  {
    show = true;
    if(jQuery('#kerngebiet-j').attr('id') == 'kerngebiet-j')
    {
        jQuery('#kerngebiet-j').prop('checked',true);
        toggleKerngebietAuswahl(true);
    }
  }
  else
  {
      if(jQuery('#kerngebiet-j').attr('id') == 'kerngebiet-j')
      {
         if(jQuery('#kerngebiet-j').prop('checked') == true)
         {
            show = true;
         }
      }
  }
    if(typeof jhalmap == 'object'&&jhalmap!=null&&show)
    {
       var kg_options = {stadt_id: jQuery('#stadt_id').val(), zoom_to_polybounds: 'N'};
       if(arguments.length == 1 && typeof arguments[0] == 'object')
       {
            kg_options = jQuery.extend(kg_options, arguments[0]);
       }
       // erstmal wieder die Ploys entfernen
       hideKerngebiet();
       jQuery.log('kerngebiet für: '+kg_options.stadt_id);
       
       /* Kerngebiete */
       if(kg_options.stadt_id > 0)
       {        
            var stadtId = kg_options.stadt_id;
            var kerngebietUrl = '/resourcen/map_xml/';
            if(stadtId > 0)
            {
               jQuery.ajax({
                        type: 'GET'
                        ,url: kerngebietUrl+'kerngebiet_stadt'+stadtId+'.xml'
                        ,dataType: 'xml'
                        ,success: function(data, textStatus){
                              var polydefs = data.documentElement.getElementsByTagName('CAB_K_Gebiete');
                              var polyBounds = new GLatLngBounds();
                              for(var lcount = 0; lcount < polydefs.length; lcount++)
                              {
                                var points = polydefs[lcount].getElementsByTagName('Punkte');
                                var pts = [];
                                for (var pcount = 0; pcount < points.length; pcount++) {
                                   pts[pcount] = new GLatLng(parseFloat(points[pcount].getAttribute('Lat'))
                                                            ,parseFloat(points[pcount].getAttribute('Lon')));
                                   polyBounds.extend(pts[pcount]);                                                            
                                }
                                var PolyObject = polydefs[lcount].getElementsByTagName('polys');
                                if (PolyObject.length > 0) {
                                    var polyTitle =  'Kerngebiet von '+PolyObject[0].getAttribute('PolyName');
                                    var bgColor = PolyObject[0].getAttribute('PolyFillColor');
                                    var polyId = PolyObject[0].getAttribute('PolyId');
                                }else{
                                    var Land = '';
                                    var bgColor = '';
                                    var polyId = 'none'
                                }
                                var myPoly = CreatePolygon(pts,{fillColor: bgColor,poly_name: polyTitle,poly_id: polyId});
                                
                                jhalmap.addOverlay(myPoly);
                              }
                              kerngebietBounds.push({stadt_id: stadtId, bounds: polyBounds});
                              if(kg_options.zoom_to_polybounds == 'J')
                              {
                                var center = polyBounds.getCenter();                                
                                var mapType = jhalmap.getCurrentMapType();                                
                                jhalmap.setCenter(center,mapType.getBoundsZoomLevel(polyBounds,jhalmap.getSize()));                                                                    
                              }
                        }});
            }
       }
    }
};
function hideKerngebiet()
{
    jQuery.log('Anzahl Polys: '+polys.length);
    var _newPolys = polys;
    polys = []; //reset
    jQuery.each(_newPolys,function(i,p){
         jhalmap.removeOverlay(p);         
    });
};
function zoom2Kerngebiet(stadt_id)
{
    var zoom_done = false;
    if(kerngebietBounds.length > 0)
    {
      var mapType = jhalmap.getCurrentMapType();
      var mapSize = jhalmap.getSize();      
        jQuery.each(kerngebietBounds, function(i,b){
          if(b.stadt_id == stadt_id) {
            var center = b.bounds.getCenter();
            jhalmap.setCenter(center,mapType.getBoundsZoomLevel(b.bounds,mapSize));
            zoom_done = true;
            return false;
          }
        });
    }
    return zoom_done;
};
function displayLegende()
{
    if(arguments.length > 0)
    {
        var text = arguments[0];
        if(typeof parent.document.getElementById('markerlegende') == 'object' && null != parent.document.getElementById('markerlegende')) {
            var pTag = parent.document.getElementById('markerlegende').innerHTML = text;
        }
        if(typeof document.getElementById('markerlegende') == 'object' && null != document.getElementById('markerlegende')) {
          var pTag = document.getElementById('markerlegende').innerHTML = text;        
        }
    }
};
function show_all_kerngebiete(zoom_in)
{
    jQuery('#stadt_id > option').each(function(){
        if(jQuery(this).hasClass('jq-cabflex'))
        {
            //jQuery.log('Stadtliste: '+jQuery(this).attr('class')+' id: '+jQuery(this).attr('value'));
            showKerngebiet({zoom_to_polybounds: zoom_in,stadt_id: jQuery(this).attr('value')});     
        }
    });
};
//var hal2debug = true;
/** Umkreis um einen Punkt mit einem best. Radius anzeigen 
 *  hierfür wird DataObject + jQuery benötigt
 */
function mapCircle()
{
  this.map = false;
  this.data = {marker: false, x: 0.0, y: 0.0, radius: 100, linewidth: 1, linecolor: '#0000FF', fillcolor: '#FFFF33'};
  this.circle = false;
  if(arguments.length == 1 && typeof arguments[0] == 'object') {
        this.data = jQuery.extend(this.data,arguments[0]);
  }
  this.superclass(this.data);
  this.getZoom = function(){
    return this.map.getZoom();
  };
  this.getCenterLatLng = function()
  {
    return (false != this.getVal('marker') ? this.getVal('marker').getLatLng() : new GLatLng(this.getVal('y'),this.getVal('x')));
  };
  this.getPixelPoint = function(latlon)
  {
    return this.map.fromLatLngToDivPixel(latlon);
  };
  this.getLatLngFromPixelPoint = function(cPoint)
  {
    return this.map.fromDivPixelToLatLng(cPoint, this.getVal('zoom')); 
  };
  this.draw = function(map)
  {
    this.map = map;
    if(this.circle == false)
    {
        var zoom = this.getZoom();
        var latlon = this.getCenterLatLng();
        if(this.getVal('x') != 0.0){        
        	latlon = new GLatLng(this.getVal('y'),this.getVal('x'));
        }
        
        var centerPt = this.getPixelPoint(latlon);
        var firstLatLng = get_LatLngFromCenterByDistance(latlon,this.getVal('radius'));        
        var radiusPt = this.getPixelPoint(firstLatLng);
        
        var circlePoints = [];
        
        with (Math) {
            radius = floor(sqrt(pow((centerPt.x-radiusPt.x),2) + pow((centerPt.y-radiusPt.y),2)));    
            for (var a = 0 ; a < 361 ; a+=10 ) {
                var aRad = a*(PI/180);
                var y = centerPt.y + (radius) * sin(aRad)
                var x = centerPt.x + (radius) * cos(aRad)
                var cPoint = new GPoint(x,y);
                var cLatLng = this.getLatLngFromPixelPoint(cPoint);
                circlePoints.push(cLatLng);
            }                    
        }
    
        if(this.getVal('fillcolor') != '')
        {
            this.circle = new GPolygon(circlePoints,this.getVal('linecolor'),this.getVal('linewidth'),0.8,this.getVal('fillcolor'),0.5);
        }
        else
        {
            this.circle = new GPolygon(circlePoints,this.getVal('linecolor'),this.getVal('linewidth'),0.8);
        }
    }
    this.map.addOverlay(this.circle);
    this.map.setCenter(this.getCenterLatLng());
  };
  this.show = function(map)
  {
    this.draw(map);
  };
  this.hide = function(map)
  {
    this.map = map;
    if(this.circle){
        this.map.removeOverlay(this.circle);
    }
  };
};
if(typeof DataObject == 'function') {
    mapCircle.prototype.superclass = DataObject;
};

/**
 * Gibt ein GLatLng-Object zurück, welches sich in einer Entfernung distance(in metern) von GLatLng
 * in Richtung direction befindet
 * @param   object  GLatLng -   Startpunkt
 * @param   int             -   Entfernung in Metern
 * @param   number          -   Winkel in Grad-Angaben 0 - 360, wobei default 0(ausrichtung nach Norden)
 *                              Bewegung erfolgt im Uhrzeigersinn 
 */
function get_LatLngFromCenterByDistance(cLatLng, distance)
{
    var Lat1 = cLatLng.lat().toRad();
    var Lng1 = cLatLng.lng().toRad();
    var EarthRadius = 6371;
    var angle = 0; // Richtung in Grad    
    
    if(arguments.length > 2){ angle = arguments[2]; }
    angle = angle.toRad();
    
    distance = (distance/1000)/EarthRadius; // in radiants
    
    var Lat2 = Math.asin(Math.sin(Lat1)*Math.cos(distance)+ 
                      Math.cos(Lat1)*Math.sin(distance)*Math.cos(angle));
    var Lng2 = Lng1 + Math.atan2(Math.sin(angle)*Math.sin(distance)*Math.cos(Lat1), 
                      Math.cos(distance)-Math.sin(Lat1)*Math.sin(Lat2));
    Lng2 = (Lng2+3*Math.PI)%(2*Math.PI) - Math.PI;  // normalisieren -> -180 bis +180
    // jQuery.log('ergebnis: '+Lat2.toDeg()+'/'+Lng2.toDeg());
    return new GLatLng(Lat2.toDeg(),Lng2.toDeg());
}

/** Converts numeric degrees to radians */
if (typeof(Number.prototype.toRad) === "undefined") {
  Number.prototype.toRad = function() {
    return this*Math.PI/180;
  }
}

/** Converts radians to numeric (signed) degrees */
if (typeof(Number.prototype.toDeg) === "undefined") {
  Number.prototype.toDeg = function() {
    return this*180/Math.PI;
  }
}

/* Adress-Suchmaske initialisieren */
var mapBuchAnfrageParams = null;
function init_address_searchmask()
{
     if(typeof G_HAL_GEOCODER_URL != 'string') { return true; }
     var aktive_element_id = null;
     if(arguments.length > 0){
        aktive_element_id = jQuery(arguments[0]).attr('id');
     }
     
     /**
      * Wenn eine Adress-Eingabe erfolgt, werden die anderen Felder(landauswahl, stadtauswahl, stationauswahl) deaktiviert
      */
     jQuery('#bform2 #gmap_address').bind('focus keydown blur',function(){
        var eingabe = jQuery(this).val();
        if(eingabe != jQuery(this).data('default') && eingabe != '') {
            jQuery('#bform2 .jq-landsel, #bform2 select[name=stadt_id], #bform2 select[name=station_id], #bform2 input[name=station_name]').prop('disabled',true);
        }else{
            jQuery('#bform2 .jq-landsel, #bform2 select[name=stadt_id], #bform2 select[name=station_id], #bform2 input[name=station_name]').prop('disabled',false);
        }
     });
     
     var hal2AddressOptions = {ajaxUrl: G_HAL_GEOCODER_URL};
     /**
      * Wenn wir die Google-Map-Suche haben, dann benötigen wir ein paar callbacks
      */
     if(jQuery('#gmap_searchBtn').is('input[type=button]')){
        hal2AddressOptions = jQuery.extend(hal2AddressOptions,{'resultCallback': function(event, data, formatted){
        	                                                var _searchOptions = {'brequest':false};
                                                            if(jQuery('#gmap_searchBtn').data('brequest') != ''){
                                                                var _form = jQuery('#gmap_searchBtn').data('brequest');
                                                                jQuery.log('Buchungsanfrage via Geokoords: '+_form);
                                                                _searchOptions = xajax.getFormValues(_form);
                                                            }
                                                            jQuery('#gmap_searchBtn').prop('disabled',true);
                                                            newGeoSearch(jQuery('#gmap_address').val(),function(){jQuery('#gmap_searchBtn').prop('disabled',false);},_searchOptions);
                                                           }
                                            });
        jQuery('#gmap_searchBtn').click(function(event) {
            if(typeof jhalmap == 'object') {
              var adresse = jQuery('#gmap_address').val();
              hal2AddressOptions.resultCallback(event, {}, '');
            }
        });
     };
     
     jQuery('#gmap_address').hal2Address(hal2AddressOptions);
     
     var _searchOptions = {'brequest':false};     
     /* */
     
     /* haben wir eine Buchungsanfrage */
     if(null != aktive_element_id && 'buchanfrageform' == aktive_element_id)
 	 {
         jQuery.log('init buchanfrage-form');
         // init des Buchungsnafrage_Formular
         
         if(typeof mapBuchAnfrageParams != 'object' || mapBuchAnfrageParams == null){
             mapBuchAnfrageParams = new BuchanfrageParams(['bform3']
                                                    ,{min_intervall: '15', use_mousewheel: false,webfirma_id:webfirma_id}
                                                    ,stationACOptions);
         }
         mapBuchAnfrageParams.init();
         // Calendar-Setup 
         initCalenderSetup('von',{},mapBuchAnfrageParams);
         initCalenderSetup('bis',{},mapBuchAnfrageParams);
         jQuery.log('loadmarker-eventhandler: '+typeof G_HALMAP_MOVEEND_EVENT_LOADMARKER);
         if(typeof G_HALMAP_MOVEEND_EVENT_LOADMARKER == 'object' && null != G_HALMAP_MOVEEND_EVENT_LOADMARKER){
            jQuery.log('entferne loadmarker-handler');
            GEvent.removeListener(G_HALMAP_MOVEEND_EVENT_LOADMARKER);
            G_HALMAP_MOVEEND_EVENT_LOADMARKER = null;
         }
     }
     if(null != aktive_element_id)
     {
     	switch(aktive_element_id){
     		case 'buchanfrageform':
     		 // hier sollten keine marker angezeigt werden, wegen der Übersichtlichkeit
     		 if(jhalmap.getZoom() >= 10){
         		 var _form = jQuery('#gmap_searchBtn').data('brequest');
                 jQuery.log('Buchungsanfrage via Geokoords: '+_form);
         		 _searchOptions = xajax.getFormValues(_form);
         		 newGeoSearch('',function(){},_searchOptions);
     		 }
     		break;
     		default:
                if(typeof jhalmap == 'object' && (typeof G_HALMAP_MOVEEND_EVENT_LOADMARKER != 'object' || null == G_HALMAP_MOVEEND_EVENT_LOADMARKER)){
                    jQuery.log('füge loadmarker-handler hinzu '+typeof G_HALMAP_MOVEEND_EVENT_LOADMARKER);
                    G_HALMAP_MOVEEND_EVENT_LOADMARKER = GEvent.bind(jhalmap,'moveend',jhalmap,function(){getKacheln();});
                }
                getKacheln();
            break;
     	};
     }
};
