 /***********************************************************************
 * 		Klasse zur Anzeige der Karte und Interaktion					*
 * 		C 2009 by Thomas Müller @ mindbox	                            *
 * 
 * 		!!! BUG: bei readytour franken waren die legs eher alle         *
 *      als die Entries, hier wurde der letzte und einzige              *
 *      in Tag 4 vergessen                                              *
 ************************************************************************/

var mbxMap = new Class({
	mbxMap: function (parentElement) {
		eContent.Map.call(this, parentElement);
		this.inherit(eContent.Map);
	},
	
	inherit : function(superClass) {
    	var tmpClass = function() {};
    	tmpClass.prototype = superClass.prototype;
    	this.prototype = new tmpClass();
	},
	
	LoadMap: function (pix, zoom) {
		eContent.Map.LoadMap(pix, zoom);
	},			
					
	ShowInfoBox : function(shape, anchor, offset){
		eContent.Map.ShowInfoBox(shape, anchor, offset);
	}
});


var HuberMap = new Class({
	tpMapSelector : null,
	tpMap : null,
	tour: null,
	pinTypes: null,
	colors: null,
	markers:null,
	mapStyle:null,

	// Konstruktor
	initialize: function(parentElement){
		HuberMap.instance = this;
		if ($type(parentElement) !== 'false') {
			this.tpMapSelector = parentElement;
		} else {
			this.tpMapSelector = 'tpMap';
		}
		this.markers = new Hash();
	},
	
	initMap: function(){
		this.tpMap = new eContent.Map(this.tpMapSelector);
        this.tpMap.LoadMap(new VELatLong(48.25467263130591,11.62353515625), 8);
        this.tpMap.SetMapStyle(VEMapStyle.Road);
    	this.tpMap.Resize(601,466);
        this.tpMap.SetPopupOnHover(false);
		if(Browser.Engine.gecko){
			this.tpMap.AttachEvent('onmousewheel', this.trap);
			$(this.tpMapSelector).addEvent('mousewheel', function(ev){
				var ev = new Event(ev)
				ev.stop();
				if (ev.wheel > 0) {
					HuberMap.instance.tpMap.ZoomIn();
				} else {
					HuberMap.instance.tpMap.ZoomOut();
				}
			});
		}
		if(Browser.Engine.trident){
			this.tpMap.AttachEvent('onmousewheel', this.zoom);
			// wegen utf-8 Zeichen a
			this.tpMap.AttachEvent('onchangemapstyle', this.changeView);
		}
		this.tpMap.AttachEvent('onclick',this.mapClickEvent);
		this.deleteMapControls.delay(1000);
		this.pinTypes = new SGPinType();
		this.colors = new SGColorType();
		
		this.getAllMarkers();
    },

    addMarker: function(marker) {
		var layer_array = new Array(new VEShapeLayer(), new VEShapeLayer(), new VEShapeLayer(), new VEShapeLayer(), new VEShapeLayer());
		for (var i = 0; i < 5; i++) {
			layer_array[i].SetTitle(String(i));
			marker[i].each(function (entry,j) {
				var pin = this.tpMap.CreatePinShape(new VELatLong(entry.y, entry.x), i);
	            // Titel und HTML setzen
	       		pin.SetTitle(entry.name_entry);
	       		pin.SetDescription(this.addCloseButton() + entry.htmlCode + this.addInfoBoxBtn(entry));
				pin.SetCustomIcon(this.pinTypes.getPinImg(i));			
				
	       		layer_array[i].AddShape(pin);
				this.markers.set(entry.id, pin);
			}.bind(this));
			layer_array[i].Hide();
       		this.tpMap.AddShapeLayer(layer_array[i]);
		}
		marker = null;
    },

    // Eine Tour anzeigen
    showTour: function(tour) {
		var opt = new VERouteOptions();
		opt.DistanceUnit = VERouteDistanceUnit.Kilometer;
		opt.RouteCallback = this.getDirectionsResult;
		opt.DrawRoute = false;

		this.tour = tour;
		var points = new Array();
		// Die Tour einlesen
		// Start
		tour.tourStart.dcEntries.each(function (entry) {
			if ((entry.x != '') && (entry.y != '')) {
				points.push(new VELatLong(entry.y, entry.x));
			}
		}.bind(this));
		
		// Jeden Eintrag jeden tages durchgehen
		tour.dcDays.each(function (day){
			day.dcEntries.each(function (entry) {
				// Koordinaten für die Route sammeln
				if ((entry.x != '') && (entry.y != '')) {
					points.push(new VELatLong(entry.y, entry.x));
				}
			}.bind(this));
			
			// Das Übernachtungshotel, falls angegeben, auch einzeichnen
			if (day.id_acco != '') {
				var dayAcco = TourPlanner.instance.getAccoFromId(day.id_acco, tour);		
				if (dayAcco != null) {
					if ((dayAcco.x != '') && (dayAcco.y != '')) {
						points.push(new VELatLong(dayAcco.y, dayAcco.x));
					}
				}
			}			
		}.bind(this));
	
		if (points.length > 0) {
			try {
				this.tpMap.GetDirections(points, opt);
			}catch(e){
				alert('Your Route could not be drawn on the map');
			}
   		}
    },

    // Eine Tour entfernen
    deleteTour: function() {
    	var i = 0;
		
		while(i < this.tpMap.GetShapeLayerCount()) {
			var layer = this.tpMap.GetShapeLayerByIndex(i);
			if (layer.GetTitle().indexOf('Route') != -1) {
	    		this.tpMap.DeleteShapeLayer(layer);
	    	} else {
				i++;
    		}
		}

    	this.tpMap.DeleteRoute();
    	this.tour = null;
    },

    changeTour: function(tour) {
		 this.deleteTour();
		 this.showTour(tour);
    },

    changeIconVisibility: function (name, doEnable) {		
      	var pType = this.pinTypes.getPinType(name);
        for (var i = 0; i < this.tpMap.GetShapeLayerCount(); i++) {
       		var layer = this.tpMap.GetShapeLayerByIndex(i);
			if (String(pType) == layer.GetTitle()) {
			   if (doEnable)  {
               		layer.Show();
               } else {
               		layer.Hide();
               }
            }
		}
    },

    getDirectionsResult: function (route) {
		var tour = HuberMap.instance.tour;

		tour.distance = route.Distance;
    	tour.journeytime = route.Time;
		// -1 weil der erste Punkt der Startpunkt ist und somit noch keine route besitzt
		var i = -1;
		var dayNumber = 0;
		var pinArray = new Array();
       	var layer = new VEShapeLayer();
		var layer2 = new VEShapeLayer();
//		
//		for (var i = 0; i < HuberMap.instance.tpMap.GetShapeLayerCount(); i++) {
//			var layer = HuberMap.instance.tpMap.GetShapeLayerByIndex(i);
//			if(layer.GetTitle() == 'Route' || layer.GetTitle() == 'RoutePins'){
//				HuberMap.instance.tpMap.DeleteShapeLayer(layer);
//			}
//		}
		layer.SetTitle('Route');
		layer2.SetTitle('RoutePins');
		var allPoints = new Array();
		var firstDay = true;

		// Die Tour einlesen
		tour.dcDays.each(function (day) {
			var points = new Array();
			var dayDistance = 0;
			var dayJourneyTime = 0;
			var tourStartId = '';

			// Tour Start mit beachten
			if (firstDay) {
				tour.tourStart.dcEntries.each(function (entry) {
					
					// TourStartId speichern
					tourStartId = entry.id_sg_entry;
					
					// Pin für die Station erstellen
					var cPin = HuberMap.instance.markers.get(entry.id_sg_entry);
					if (cPin) {
						pinArray.push(HuberMap.instance.createTourPinShape(cPin, HuberMap.instance.pinTypes.getPinType('gmOptionsStart')));
					}
					
					if ($type(route.RouteLegs[i]) != false) {
						leg = route.RouteLegs[i];
		
						dayDistance += leg.Distance;
						dayJourneyTime += leg.Time;
		 				if (leg.Itinerary && leg.Itinerary.Items) {
		               		for(var j=0; j < leg.Itinerary.Items.length; ++j) {
		                       	var item = leg.Itinerary.Items[j];
		                   		if (item && item.Shape) {
		                       		item.Shape.Hide();
		                   		}
		                     	if (item && item.LatLong) {
		                       		points.push(item.LatLong);
		                       		allPoints.push(item.LatLong);
		                   		}
		                  	}
						}
					}			
					i++;
				}.bind(this));
			}
			firstDay = false;

			day.dcEntries.each(function (entry) {
				// Pin für die Station erstellen
				var cPin = HuberMap.instance.markers.get(entry.id_sg_entry);
				// Anm: Wenn der Tour Start gleich einem Eintrag, dann nicht Icon überblenden
				if ((cPin) && (tourStartId != entry.id_sg_entry)) {
					pinArray.push(HuberMap.instance.createTourPinShape(cPin, parseInt(cPin.GetShapeLayer().GetName())));
				}
					
				if (route.RouteLegs[i]) {
					leg = route.RouteLegs[i];
					entry.distance = leg.Distance;
					entry.journeyTime = leg.Time;

					dayDistance += leg.Distance;
					dayJourneyTime += leg.Time;

 					if (leg.Itinerary && leg.Itinerary.Items) {
                		for(var j=0; j < leg.Itinerary.Items.length; ++j) {
                        	var item = leg.Itinerary.Items[j];
                       		if (item && item.Shape) {
                          		item.Shape.Hide();
                      		}
                       		if (item && item.LatLong) {
                         		points.push(item.LatLong);
                         		allPoints.push(item.LatLong);
                       		}
                    	}
					}
				}
				i++;
			}.bind(this));

			// Das Übernachtungshotel, falls angegeben, auch einbeziehen
			if (Number(day.id_acco) != 0) {
				var entry = TourPlanner.instance.getAccoFromId(day.id_acco, tour);		

				if (entry != null) {
					// Pin für die Station erstellen
					var cPin = HuberMap.instance.markers.get(entry.id_sg_entry);
					if (cPin) {
						pinArray.push(HuberMap.instance.createTourPinShape(cPin, 0));
					}
					
					if ($type(route.RouteLegs[i]) != false) {
						leg = route.RouteLegs[i];
	
						dayDistance += leg.Distance;
						dayJourneyTime += leg.Time;
	 					if (leg.Itinerary && leg.Itinerary.Items) {
	                		for(var j=0; j < leg.Itinerary.Items.length; ++j) {
	                        	var item = leg.Itinerary.Items[j];
	                       		if (item && item.Shape) {
	                          		item.Shape.Hide();
	                      		}
	                       		if (item && item.LatLong) {
	                         		points.push(item.LatLong);
	                         		allPoints.push(item.LatLong);
	                       		}
	                    	}
						}
					}
					i++;
				}
				
			}		
			
			day.distance = dayDistance;
			day.journeyTime = dayJourneyTime;
			if (points.length > 0) {
				var newLine = new VEShape(VEShapeType.Polyline, points);
				newLine.SetTitle('Line_' + String(dayNumber));
				newLine.SetLineColor(HuberMap.instance.colors.getColor(dayNumber));
				newLine.SetLineWidth(5);
				newLine.HideIcon();
				layer.AddShape(newLine);
			}
			dayNumber++;
		}.bind(this));
    	HuberMap.instance.tpMap.AddShapeLayer(layer);
    	
		// Pins für die Start und Finish setzen
		pinArray[0].SetCustomIcon(HuberMap.instance.pinTypes.getPinImg(5));
		var len = pinArray.length-1;
		pinArray[len].SetCustomIcon(HuberMap.instance.pinTypes.getPinImg(6));

		// Pins für die Tour hinzufügen
		pinArray.each(function (pin) {
			layer2.AddShape(pin);
		}.bind(this));		
		HuberMap.instance.tpMap.AddShapeLayer(layer2);
		
		HuberMap.instance.tpMap.SetMapView(allPoints);
		TourPlanner.instance.sendMessage('editor','updateEntryListInfos', new Hash().set('tour', tour));
		TourPlanner.instance.currentTour = tour;
		
		return true;
    },
	
	createTourPinShape: function(cPin, i){
		var pin = this.tpMap.CreatePinShape(new VELatLong(cPin.Latitude, cPin.Longitude), 'RoutePins');
   		pin.SetTitle(cPin.GetTitle());
   		pin.SetDescription(cPin.GetDescription());
		pin.SetCustomIcon(this.pinTypes.getPinImg(i));
		return pin;
	},
	
	trap: function(){
		return true;
	},
	
	zoom: function(e){
		if(e.mouseWheelChange > 0){
			HuberMap.instance.tpMap.ZoomIn();
		}else{
			HuberMap.instance.tpMap.ZoomOut();
		}
		return true;
	},
	
	changeView: function(e){
		if(!HuberMap.instance.mapStyle != e.mapStyle){
			HuberMap.instance.deleteUtfSign.delay(100);
		}
	},
	deleteUtfSign: function(){
		if ($('eContent.StatusBar')) {
			var tds = ($('eContent.StatusBar').getElements('td'));
			if (tds[1].get('html').contains('©')) {
				tds[1].set('html', tds[1].get('html').substr(1));
			}
		}
	},
	
	panTo: function(center){
		this.tpMap.PanToLatLong(center);
	},
	
	getCenter: function(){
		return this.tpMap.GetCenter();
	},
	
	setCenter: function(lat,lon){
		this.tpMap.SetCenter(new VELatLong(lat,lon));
	},
	
	resize: function(w, h){
		this.tpMap.Resize(w,h);
	},
	
	getAllMarkers: function(){
		this.addMarker(TourPlanner.instance.dh.getData('','tpMarker'));
	},
	
	deleteMapControls: function(){
		$('menuBirdsEye').dispose();
		$('menu3d').destroy();
	},
	
	addCloseButton: function(){
		var margTop = (Browser.Engine.gecko ? '-35' : '-40');
		return '<img id="VECloseInfoBox" alt="close_button" title="close the Infobox" src="/templates/img/tourplanner/closeedittourdesc.gif" style="position:absolute; cursor:pointer; margin-top: ' + margTop + 'px; margin-left:-3px;" />';
	},
	
	addInfoBoxBtn:  function(e){
		var btns = '';
		if(TourPlanner.instance.inCurrentTour(e.id)){
			var bClass = 'btnAddEntry';
		}else{
			var bClass = 'btnRemoveEntry';
		}
		btns += '<a href="#" class="gManipulateButton ' + bClass + '" id="gManipulateButton_' + e.id + '">';
		btns += '<a class="gDetails" href="/Service-Provider/Service-Provider-Details.html?id=' + e.id + '" target="_blank">';		
		return '<div class="gButtons">' + btns + '</div>';
	},
	
	mapClickEvent: function(e){
		if (e != null) {
			if (e.elementID != null) {
				TourPlanner.instance.map.checkInfoBoxButtons(e);
				TourPlanner.instance.map.getBoxPosition(e);
				return true;
			}
		}
		return true;
	}.bind(this),
	
	checkInfoBoxButtons: function(e){
		$('VECloseInfoBox').addEvent('click', function(ev){
			HuberMap.instance.tpMap.HideInfoBox();	
		});
		var elem = $$('.ero')[0].getElement('.gManipulateButton');
		var id = elem.getProperty('id').replace(/.*\_/,'');
		
		// Beim Öffnen kontrollieren, ob richtiger Button angezeigt wird
		if(TourPlanner.instance.inCurrentTour(id)) {
			elem.setProperty('id','gRemoveFromPlanner_'+id);
			elem.removeClass('btnAddEntry');
			elem.addClass('btnRemoveEntry');
		} else {
			elem.setProperty('id','gAddToPlanner_'+id);
			elem.removeClass('btnRemoveEntry');
			elem.addClass('btnAddEntry');
		}			

		// Und dann als Event noch mal dran hängen
		elem.removeEvents('click');
		elem.addEvent('click',function(ev){
			HuberMap.instance.tpMap.HideInfoBox();
			if (TourPlanner.instance.inCurrentTour(id)) {
				elem.setProperty('id', 'gAddToPlanner_' + id);
				elem.removeClass('btnRemoveEntry');
				elem.addClass('btnAddEntry');
				TourPlanner.instance.removeElement(id);
			} else {
				elem.setProperty('id', 'gRemoveFromPlanner_' + id);
				elem.removeClass('btnAddEntry');
				elem.addClass('btnRemoveEntry');
				TourPlanner.instance.addElement(id);
				var cClass = $(e.elementID).getElement('.pinIcon').getProperty('class').replace(/.* /,'');
				HuberMap.instance.changeIconVisibility(cClass, false);
				HuberMap.instance.changeIconVisibility(cClass, true);
			}

			// Default Klickverhalten abfangen
			if (!elem.hasClass('gDetails')) {
				var ev = new Event(ev);
				ev.stop();
			}
		});
		
		
		return true;
	},
	
	getBoxPosition: function(e){
		var mapPos = $('tourMap').getPosition();
		var ib = ($$('.ero'))[0];
		ib.setStyles({
			'top': Number(mapPos.y) + Number(e.mapY) - Number(ib.getSize().y) +17,
			'left': Number(mapPos.x) + Number(e.mapX)
		});
	}
});
