// Copyright 2007 Dr. Krusche und Partner PartG
// Autor: Dr. Stefan Krusche, krusche@dr-kruscheundpartner.de


// --------------------------------------------------------------------------
// --------------------------------------------------------------------------

// globale variable

// selectieren und deselectieren der marker
var markers  = {};
var gManager = null;

var veLAT = 0;
var veLON = 0;

// --------------------------------------------------------------------------
// --------------------------------------------------------------------------

function TMarker() {

  // ein travel marker ist ein container fuer einen regulaeren google maps marker; 
  // diese variante wird (gegenueber pdmarker) bevorzugt, da damit keine 
  // initialisierungsprobleme im internet explorer auftreten

  this.cData   = null;
  this.gMarker = null;
  
  // geo coordinates
  this.lat   = '';
  this.lon   = '';
  this.title = '';
  
  // image uri
  this.regularImage  = '';
  this.hoverImage    = '';
  this.clickImage    = '';
  
  // html info text
  this.html          = '';
  
  this.selected      = false;
  
}

TMarker.prototype.setRegularImage = function(url) {
  this.regularImage = url;
}

TMarker.prototype.setHoverImage = function(url) {
  this.hoverImage = url;
}

TMarker.prototype.setClickImage = function(url) {
  this.clickImage = url;
}

// --------------------------- gMarker --------------------------------------

TMarker.prototype.getGMarker = function() {
  return this.gMarker;
}

TMarker.prototype.setGMarker = function(marker) {
  this.gMarker = marker;
}

// --------------------------- cData ----------------------------------------

TMarker.prototype.getCData = function() {
  return this.cData;
}

TMarker.prototype.setCData = function(data) {
  this.cData = data;
}

// --------------------------- html ----------------------------------------

TMarker.prototype.getHTML = function() {
  return this.html;
}

TMarker.prototype.setHTML = function(html) {
  this.html = html;
}

// --------------------------------------------------------------------------
// --------------------------------------------------------------------------

// TMaps
//
// das zentrale anwendungsobjekt zur darstellung georeferenzierter
// informationen auf einer von google maps zur verfuegung gestellten
// karte mit satelliten bildern

function TMaps() {   
    // reference to google maps component
    this.gmap = null;   
    
    // geographische daten
    this.gData = new Array();
    
}

// instantiierung
travelMaps = new TMaps();

// --------------------------------------------------------------------------
// -------------------------- createMarker ----------------------------------

TMaps.prototype.createMarker = function(data) {
    
    // ----------------------------------------------------------------------
    // ----------------------- daten lokal definieren -----------------------
    var _ix    = data['ix']   
    
    var _title = data['title']   
    var _lat   = data['lat'];
    var _lon   = data['lon'];
    
    //var _thumb = data['thumb'];
    //var _info  = data['info'];
    
    var _gmap = this['gmap'];
    
    // ----------------------------------------------------------------------
    // ----------------------- google maps point setzen ---------------------

    var _latlon = '_'+_lat+'#'+_lon;
    var _exMarker = null;
    
    try {
        _exMarker = markers[_latlon];
    }
    catch(err) {}

    if (_exMarker) {
    	
    	var _gMarker = _exMarker.getGMarker();   	
        _gmap.removeOverlay(_gMarker);
    }
    
    // ----------------------------------------------------------------------
    // ----------------------- google maps point setzen ---------------------
    
    var _point = new GLatLng(_lat, _lon);

    // ----------------------------------------------------------------------
    // ----------------------- google maps icon -----------------------------

    var _regularImage = "gmaps_icons/icon.marker." + _ix + ".off.png";
    var _clickImage   = "gmaps_icons/icon.marker." + _ix + ".on.png";
    var _hoverImage   = "gmaps_icons/icon.marker." + _ix + ".hover.png";

    var _icon = new GIcon();
   
    _icon.image            = _regularImage;
    _icon.iconSize         = new GSize(20,20);
    _icon.iconAnchor       = new GPoint(10,10);
    _icon.infoWindowAnchor = new GPoint(17,5);
    
    // ----------------------------------------------------------------------
    // ---------------------- travel maps marker ----------------------------                

    markers[_latlon] = new TMarker();

    markers[_latlon].setGMarker( new GMarker(_point, {icon: _icon, title: _title}) );
    markers[_latlon].setCData( data );

    markers[_latlon].setRegularImage(_regularImage);
    markers[_latlon].setClickImage(_clickImage);
    markers[_latlon].setHoverImage(_hoverImage);

    /* daten setzen                                                        */
    markers[_latlon].title = _title;
    markers[_latlon].lat   = _lat;
    markers[_latlon].lon   = _lon;

    // ---------------------- mouse out event -------------------------------

    GEvent.addListener(markers[_latlon].gMarker, "mouseout", function() {
        
        if (markers[_latlon].selected) return;
        markers[_latlon].gMarker.setImage( markers[_latlon].regularImage );

    });

    // ---------------------- mouse over event ------------------------------

    GEvent.addListener(markers[_latlon].gMarker, "mouseover", function() {

        if (markers[_latlon].selected) return;
	markers[_latlon].gMarker.setImage( markers[_latlon].hoverImage );

    });

    // --------------- click event ------------------------------

    GEvent.addListener(markers[_latlon].gMarker, "click", function() {
	markers[_latlon].selected = true;
	markers[_latlon].gMarker.setImage( markers[_latlon].clickImage );
        
        /* die folgenden parameter werden unterstuetzt:
         *
         * a : arial
         * r : road
         * h : hybrid
         * o : bird's eye
         */
	
	/* */
	 veLAT = parseFloat(markers[_latlon].lat);
	 veLON = parseFloat(markers[_latlon].lon);

        var _html = '<div style="text-align:center; width:400px;margin-bottom:4px;">';
        _html += '<span><b>' + markers[_latlon].title + '&nbsp;&nbsp;</b></span>';
        _html += '</div>';
	_html += '<iframe src="http://www.das-virtuellehaus.de/vmaps/ie_ve.htm" width="400" height="300" frameborder="0" scrolling="no" />';

	/*
	 *_html += '<div id="veMap" style="position:relative; width:400px; height:300px;"></div>';
	 * _html += '<script>';
         * _html += ' var map = null;';
         * _html += ' map = new VEMap("veMap");';
         * _html += ' map.LoadMap(new VELatLong(' + markers[_latlon].lat + ', ' + markers[_latlon].lon + '), 5 ,"o" ,false);';
         * _html += ' map.HideDashboard();';
         * _html += '</script>';
         */

	markers[_latlon].gMarker.openInfoWindowHtml( _html );

    });

    // --------------- open info window -------------------------

    GEvent.addListener(markers[_latlon].gMarker, "infowindowopen", function() {
    });

    
    // --------------- close info window ------------------------

    GEvent.addListener(markers[_latlon].gMarker, "infowindowclose", function() {

	markers[_latlon].selected = false;
        markers[_latlon].gMarker.setImage( markers[_latlon].regularImage );

    });
    
    return markers[_latlon].gMarker;
    
}

// --------------------------------------------------------------------------
// -------------------------- virtual earth ---------------------------------

TMaps.prototype.virtualearth = function(geoLAT, geoLON) {
	
     var map = null;
     map = new VEMap("veMap");
     
     map.LoadMap(new VELatLong(geoLAT, geoLON), 5 ,"o" ,false);
     map.HideDashboard();

}

// --------------------------------------------------------------------------
// -------------------------- loading ---------------------------------------

TMaps.prototype.loading = function(geoLAT, geoLON, geoZOOM, mapTYPE) {

    /* ------------------------------------------------------------------ */
    /*                           LOADING                                  */
    /* ------------------------------------------------------------------ */
    
    if (GBrowserIsCompatible()) {

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

        _gmap.addControl(new GLargeMapControl());
        _gmap.addControl(new GMapTypeControl());     

        _gmap.setCenter(new GLatLng(geoLAT, geoLON), geoZOOM, mapTYPE);
        
        /* Google Maps Overview Control */
        //_gmap.addControl(new GOverviewMapControl(new GSize(120,120)));

	/* Google Maps Zooming Feature */
	_gmap.enableDoubleClickZoom();
	_gmap.enableContinuousZoom();
	_gmap.enableScrollWheelZoom();

	gManager = new GMarkerManager(_gmap);
        
        /* --------------------------------------------------------------- */
        /*                         DOWNLOAD DATA                           */
        /* --------------------------------------------------------------- */
	
        GDownloadUrl("js/traveldata.xml", function(data, responseCode) {

          var xml = GXml.parse(data);
          var _markers = xml.documentElement.getElementsByTagName('marker');
	  
          for (var i = 0; i < _markers.length; i++) {
              
              var _data = {};

              _data.ix    = _markers[i].getAttribute("ix");
              _data.title = _markers[i].getAttribute("title");
	      _data.thumb = _markers[i].getAttribute("thumb");

              _data.lat   = parseFloat(_markers[i].getAttribute("lat"));
              _data.lon   = parseFloat(_markers[i].getAttribute("lon"));
              
              _data.info = GXml.value(_markers[i].getElementsByTagName("info")[0]);

      
              // create marker from data
              var _gMarker = travelMaps.createMarker(_data)
              gManager.addMarker( _gMarker, 0, 15 );
	
          }        

        });  

	gManager.refresh();
	

    }
    else {
        alert("Wir bedauern, dass Google Maps mit Ihrem Browser nicht kompatibel ist.");
    }
}