// MARKER CONTROLLER + MARKERS
// (c) 2006 by klickTel AG, Essen.
// All rights reserved. Unauthorized duplication and use prohibited.

markerController = Base.extend({
	x:0,
	y:0,
	longitude:0,
	latitude:0,
	ppmObject:null,
	lastMarkerFound:null,
	objectID:0,
	markerToDelete:null,
	streetnumber:'', 
	zipcity:'', 
	country:'',
	longitude_hidden:null, 
	latitude_hidden:null, 
	displayName:'', 
	longitude:null, 
	latitude:null,
	markerCounter:1,
	maxMarkers: 150,
	zw:false,
	
	dynamicOptions: {
		hotels:0,
		restaurants:0,
		parking:0
	},
	
	braids: {
		hotel:[9561],
		restaurant:[7694]
	},
	
	staticPoiids: {
		parking: ['7369','7313']
	},
	
	constructor: function (ppmObject) {
		this.objectID = Math.random();
		if(ppmObject == null) {
			localLog('ERROR - markerController(ppmObject) received NULL instaed of a valid ppmObject!');
		}
		this.ppmObject = ppmObject;
		ppmObject.markerAddWindow 	  = new MarkerAddWindow(ppmObject, ppmObject.parentNode.id+'_markerAddWindow');
		ppmObject.markerEditWindow 	  = new MarkerEditWindow(ppmObject, ppmObject.parentNode.id+'_markerEditWindow');
		ppmObject.markerInfoDialogWindow = new InfoDialog(ppmObject); 	
		ppmObject.markerConfirmDialogDeleteWindow = new ConfirmDialogDelete(ppmObject); 	
		ppmObject.markerConfirmDialogDeleteAllWindow = new ConfirmDialogDeleteAll(ppmObject);
		ppmObject.markerConfirmDialogRoutingWindow = new ConfirmDialogRouting(ppmObject);
		ppmObject.markerConfirmDialogLocationSaveWindow = new ConfirmDialogLocationSave(ppmObject);
		ppmObject.markerConfirmDialogTooManyLocationsWindow = new ConfirmDialogTooManyLocations(ppmObject);
	},
	
	fixMarkerArrayPositions: function(markerArray)
	{
		if(markerArray == null) {
			localLog('ERROR - fixMarkerArrayPositions: Array ist NULL!');
			return;
		}
		
		if(markerArray.length == 0) {
			return Array();
		}
		
		if(markerArray.length > 0) {
			for(i=markerArray.length-1; i>=0; i--)
			{
				markerArray[i].arrayOffset=i;
			}
			return markerArray;
		}
	},
	
	getPersistantMarkers: function()
	{	
		var url = path='http://'+location.hostname+this.ppmObject.ajaxPath+'marker'+this.ppmObject.ajaxExtension;
		var pars = 'op=getAll&_rnd='+Math.random();
		if(ppmObject.markerUrlId != null) {
			pars=pars+'&url='+ppmObject.markerUrlId;
		}
		var myAjax = new Ajax.Request( url, { method: 'get', parameters: pars,  onComplete:this.showPersistantMarkers}); 
	},
		
	showPersistantMarkers: function (obj)
	{	
		var pipeOffset=obj.responseText.indexOf('|');
		var statusCode=obj.responseText.substr(0, pipeOffset);
		var f=obj.responseText.substr(pipeOffset+1);

		savedMarkers = eval("(" + f + ")");
	
		markerEntries = 0;
		while(true) {			
			if (savedMarkers[markerEntries] != null) {
				markerEntries++;			
			} else {
				break;
			}
		}
		
		
		if(statusCode=='ERROR') {
			this.ppmObject.MarkerController.handleError(statusCode);
		} else {
			if(statusCode == 'NONE') {
				 ppmObject.scratchPads.linkMarkers.update();
				 ppmObject.scratchPads.userMarkers.update();
			} else {
				// Clean up
				ppmObject.PpmMarkers.linkMarkers=[];
				ppmObject.PpmMarkers.userMarkers=[];

				for (var i = 0; i < markerEntries; i++) {
					ppmObject.markerController.markerCounter++;
					if (savedMarkers[i] != "") {					
						if(savedMarkers[i][0]=="1") {
							mk = ppmObject.markerController.createNewMarker(0, 0, savedMarkers[i][4], savedMarkers[i][5], savedMarkers[i][6], savedMarkers[i][7], true, 'link');
							mk.isPersistent=true;
						} else {
							mk = ppmObject.markerController.createNewMarker(0, 0, savedMarkers[i][4], savedMarkers[i][5], savedMarkers[i][6], savedMarkers[i][7], true, 'user');
							mk.isPersistent=false;
						}
						mk.poiID = savedMarkers[i][1];
						mk.markerDBID = savedMarkers[i][2];
						mk.refID = savedMarkers[i][3];
						mk.ppmObject=ppmObject;
						mk.isMine=savedMarkers[i][8];

						if(mk.isPersistent) {
							ppmObject.scratchPads.linkMarkers.addMarker(mk, ppmObject, false);
						} else {
							ppmObject.scratchPads.userMarkers.addMarker(mk, ppmObject, false)
						}
					}
				}
				
				/*
				content = f.split("%--@@*%*@@--%");
				
				// Clean up
				ppmObject.PpmMarkers.linkMarkers=[];
				ppmObject.PpmMarkers.userMarkers=[];
				for (var i = 0; i < content.length; i++) {
					ppmObject.markerController.markerCounter++;
					if (content[i] != "") {
						contentPart = content[i].split("--@@**@@--");	

						if(contentPart[0]=="1") {
							mk = ppmObject.markerController.createNewMarker(0, 0, contentPart[4], contentPart[5], contentPart[6], contentPart[7], true, 'link');
							mk.isPersistent=true;
						} else {
							mk = ppmObject.markerController.createNewMarker(0, 0, contentPart[4], contentPart[5], contentPart[6], contentPart[7], true, 'user');
							mk.isPersistent=false;
						}
						mk.poiID = contentPart[1];
						mk.markerDBID = contentPart[2];
						mk.refID = contentPart[3];
						mk.ppmObject=ppmObject;
						mk.isMine=contentPart[8];
						
						if(mk.isPersistent) {
							ppmObject.scratchPads.linkMarkers.addMarker(mk, ppmObject, false);
						} else {
							ppmObject.scratchPads.userMarkers.addMarker(mk, ppmObject, false)
						}
					}
				}
				*/
			
				if(ppmObject.PpmMarkers.userMarkers.length > 0) {
					ppmObject.scratchPads.userMarkers.open();
				}
			
				if(ppmObject.PpmMarkers.linkMarkers.length > 0) {
					ppmObject.scratchPads.linkMarkers.open();
					if(!ppmObject.scratchPads.userMarkers.isOpen) ppmObject.scratchPads.userMarkers.open();
				} else {
					ppmObject.scratchPads.linkMarkers.hide();
				}

				 ppmObject.scratchPads.linkMarkers.update();
				 ppmObject.scratchPads.userMarkers.update();
			}
		}
	},
	
	
	// Called by EventController
	createMarker: function(x, y, longitude, latitude)
	{	
 		// only maxMarkers markers allowed to store
		var visible = 0; // visible markers

		for (var i = 0; i < this.ppmObject.PpmMarkers.userMarkers.length; i++) {
			if (this.ppmObject.PpmMarkers.userMarkers[i].visible == true) {
				visible++;
			}
		}
	
		if (visible == this.maxMarkers) {
			this.ppmObject.markerAddWindow.close();			
			this.ppmObject.markerInfoDialogWindow.open('Maximale Anzahl der Markierungen &uuml;berschritten', 'Sie k&ouml;nnen maximal '+this.maxMarkers+' Markierungen setzen. Bitte l&ouml;schen Sie eine der bereits vorhandenen Markierungen aus der Karte oder aus der Ablage.');
			
		} else {
			// Save data for later use
			this.x=x;
			this.y=y;
			this.longitude=longitude;
			this.latitude=latitude;
			this.ppmObject.markerAddWindow.open(null);
		}
	},
	
	handleLeftClick: function(marker)
	{

	},
	
	handleRightClick: function(marker)
	{	
		this.lastMarkerFound=marker;
		
		// Kartenverschiebung beim Kontextmenu
		if (this.ppmObject.eagleView < 2) {
			screenPos = this.ppmObject.getScreen (marker.longitude, marker.latitude);
		} else {
			x = Math.round(parseInt ($("ev_"+marker.icon.domId).style.left)-(this.ppmObject.evWidth-this.ppmObject.width)/2+ppmObject.evX)+marker.icon.offsetX;
			y = Math.round(parseInt ($("ev_"+marker.icon.domId).style.top)-(this.ppmObject.evHeight-this.ppmObject.height)/2+ppmObject.evY)+marker.icon.offsetY;
			screenPos = {x:x, y:y};
		}
		this.ppmObject.contextMenuController.x = screenPos.x;
		this.ppmObject.contextMenuController.y = screenPos.y;
		this.ppmObject.contextMenuController.showDynamicMenu(marker);
	},
	
	handlePOIRightClick: function(menu)
	{							
		marker=this.lastMarkerFound;
		
		// Kartenverschiebung beim Kontextmenu
		screenPos = ppmObject.getScreen (marker.longitude, marker.latitude);
		this.ppmObject.contextMenuController.x = screenPos.x;
		this.ppmObject.contextMenuController.y = screenPos.y;
		this.ppmObject.contextMenuController.show(menu);
	},
	

	
	handleLinkClick: function(link, marker)
	{ 
		this.ppmObject.cleanupUI();
		marker=null;
		if(marker == null) {
			marker=this.lastMarkerFound;
		}
		
		if(marker == null) {
			localLog('ERROR - markerController.handleLinkClick has no marker to handle the event, aborting!');
			return;
		}
		
		switch(link)
		{
			case 'markerController_marker_edit':
				// Bearbeiten
				this.openMarkerEditWindow(marker);
				break;
				
			case 'markerController_location_save':
				// Standort speichern
				this.locationSave(marker);
				break;
				
			case 'markerController_route_start':
				// Als Routenstart
				/*
				if(top.location.href.match("/^kartensuche\./") != -1) {
					url = top.location.href;
					//alert(url);
					goToUrl = url.replace(/kartensuche/, "routenplaner");
					top.location.href=goToUrl;	
				}
				*/
				this.routeStart(marker);
				break;
				
			case 'markerController_route_end':
				// Als Routenziel
				this.routeEnd(marker);			
				break;
				
			case 'markerController_route_stop':
				// Als Zwischenstation
				this.routeStop(marker);		
				break;
				
			case 'markerController_email':
				// Per E-Mail
				this.email(marker);
				break;
				
			case 'markerController_toggle_parking':
				// Parkmöglichkeiten in der Umgebung
				this.toggleParking(marker);
				break;
				
			case 'markerController_toggle_hotels':
				// Hotels in der Umgebung
				this.toggleHotels(marker);
				break;

			case 'markerController_toggle_restaurants':
				// Restaurants in der Umgebung
				this.toggleRestaurants(marker);
				break;
				
			case 'markerController_marker_delete':
				// Markierung loeschen
				this.ppmObject.scratchPads.userMarkers.confirmDeleteMarker(Event.e, marker);			
				break;
			
			case 'markerController_poi_route_start':
				this.routeStart(marker);
				break;
				
			case 'markerController_poi_route_end':
				// Als Routenziel
				this.routeEnd(marker);
				break;
				
			case 'markerController_poi_route_stop':
				// Als Zwischenstation
				this.routeStop(marker);		
				break;
			
			case 'poi_set_marker':
				// POIs als Markierung
				this.setPoiAsMarker(marker);
				break;							
				
			default: localLog("MarkerController.handleLinkClick: Invalid link \""+link+"\"");
		}
	},
		
	setPoiAsMarker: function (fakeMarker)
	{
		marker=this.createNewMarker(fakeMarker.xpos, fakeMarker.ypos, fakeMarker.longitude, fakeMarker.latitude, fakeMarker.displayName, "", true, 'user');
		marker.poiID=fakeMarker.poiID;
		this.ppmObject.scratchPads.userMarkers.open();
		this.ppmObject.scratchPads.userMarkers.addMarker(marker, this.ppmObject, true);
		marker.makePersistent("save", ppmObject, marker);
	},
		
	openMarkerEditWindow: function(marker)
	{
		this.lastMarkerFound=marker;
		this.ppmObject.markerEditWindow.open(marker);
	},
	
	openMarkerAddWindow: function()
	{
		this.ppmObject.markerAddWindow.open();
	},

	deleteMarker: function(marker, ppmObject)
	{	
		this.ppmObject=ppmObject;
		marker.makePersistent("delete", ppmObject, marker);
		this.ppmObject.urchinLog(216);
	},
	
	updateMarker: function(marker)
	{
		this.ppmObject.markerEditWindow.setAndClose(marker);
		this.ppmObject.scratchPads.userMarkers.update();
	},
		
	handleAddWindowSetClick: function(e, ppmObject)
	{	
		$(this.ppmObject.parentNode.id+'_markerAddWindow_Form_BtSet').disabled = true; // disable "save"-button
		this.ppmObject=ppmObject;
		
		if (Form.Element.getValue(ppmObject.parentNode.id+'_markerAddWindow_Form_Name') != '') { 
			mk=this.ppmObject.markerController.createNewMarker(this.ppmObject.markerController.x, this.ppmObject.markerController.y, this.ppmObject.markerController.longitude, this.ppmObject.markerController.latitude, this.ppmObject.markerAddWindow.displayName, this.ppmObject.markerAddWindow.description, true);
			this.ppmObject.markerAddWindow.setAndClose(mk);
			this.ppmObject.scratchPads.userMarkers.open();
			this.ppmObject.scratchPads.userMarkers.addMarker(mk, this.ppmObject, false, true);
			mk.makePersistent("save", ppmObject, mk);
			this.ppmObject.urchinLog(215);
		} else {
			window.alert('Der Markierungsname darf nicht leer sein.');
		}
		Event.stop(e);		
	},
	
	handleAddWindowCancelClick: function(e, ppmObject)
	{
		this.ppmObject=ppmObject;
		this.ppmObject.markerAddWindow.close();
		Event.stop(e);
	},

	handleEditWindowSetClick: function(e, ppmObject)
	{
		this.lastMarkerFound.displayName = Form.Element.getValue(ppmObject.parentNode.id+'_markerEditWindow_Form_Name');
		this.lastMarkerFound.description = Form.Element.getValue(ppmObject.parentNode.id+'_markerEditWindow_Form_Desc');		
		
		if (this.lastMarkerFound.displayName != '') {
			this.ppmObject=ppmObject;
			this.updateMarker(this.lastMarkerFound);
			this.lastMarkerFound.makePersistent("update", ppmObject, this.lastMarkerFound);
		} else {
			window.alert('Der Markierungsname darf nicht leer sein.');
		}
		Event.stop(e);
	},
	
	handleEditWindowCancelClick: function(e, ppmObject)
	{
		this.ppmObject=ppmObject;
		this.ppmObject.markerEditWindow.close();
	},

	handleEditWindowDeleteClick: function(e, ppmObject)
	{
		this.ppmObject.scratchPads.userMarkers.confirmDeleteMarker(e, this.lastMarkerFound);
	},
	
	closeMarkerInfoWindow: function(e, ppmObject)
	{
		ppmObject.hideInfoWindow();
	},
	
/*-------------------------------------------------------------------*/	

	// Info-Dialog	
	handleInfoDialogWindowOkClick: function ()
	{		
		this.ppmObject.markerInfoDialogWindow.close();
		if (this.zw == true) {
			$(this.ppmObject.parentNode.id+"_zstations_controller").open();
		}
	},	
	
	// Delete
	handleConfirmDialogDeleteWindowOkClick: function (ppmObject, marker)
	{	
		this.ppmObject=ppmObject;
		this.deleteMarker(this.ppmObject.markerConfirmDialogDeleteWindow.marker, ppmObject);
		this.ppmObject.markerConfirmDialogDeleteWindow.close();
	},
	
	handleConfirmDialogDeleteWindowCancelClick: function ()
	{		
		this.ppmObject.markerConfirmDialogDeleteWindow.close();
	},
	
	// DeleteAll
	handleConfirmDialogDeleteAllWindowOkClick: function (ppmObject)
	{	
		ppmObject=this.ppmObject;
		this.ppmObject.markerConfirmDialogDeleteAllWindow.close();
		this.ppmObject.markerController.lastMarkerFound.makePersistent("deleteAll", ppmObject, this.lastMarkerFound);	
		this.ppmObject.scratchPads.userMarkers.deleteMarkerAll();  		
	},
	
	handleConfirmDialogDeleteAllWindowCancelClick: function ()
	{		
		this.ppmObject.markerConfirmDialogDeleteAllWindow.close();
	},
	
	setMarker: function(marker)
	{
		this.markerToDelete = marker;
	},
	
	// Routing
	handleConfirmDialogRoutingWindowOkClick: function ()
	{
		this.ppmObject.setRoute(this.streetnumber, 
								this.housenumber,
								this.zipcity, 
								this.longitude_hidden, 
								this.latitude_hidden, 
								this.displayName, 
								this.longitude, 
								this.latitude,
								this.country);
		this.ppmObject.markerConfirmDialogRoutingWindow.close();
	},	

	handleConfirmDialogRoutingWindowCancelClick: function ()
	{
		this.ppmObject.markerConfirmDialogRoutingWindow.close();
	},
	
	// LocationSave
	handleConfirmDialogLocationSaveWindowOkClick: function ()
	{
		this.ppmObject.markerConfirmDialogLocationSaveWindow.close();
		myklickTel_window = window.open("http://my.klicktel.de", "_blank");
	    myklickTel_window.focus();
	},
	
	handleConfirmDialogLocationSaveWindowRetryClick: function ()
	{	
		this.locationSave(this.lastMarkerFound);
	},
	
	handleConfirmDialogLocationSaveWindowCancelClick: function ()
	{
		this.ppmObject.markerConfirmDialogLocationSaveWindow.close();
	},
	
	// TooManyLocations
	handleConfirmDialogTooManyLocationsWindowOkClick: function ()
	{
		this.ppmObject.markerConfirmDialogTooManyLocationsWindow.close();
		myklickTel_window = window.open("http://my.klicktel.local/standorte.php", "_blank");
	    myklickTel_window.focus();
	},
	
	handleConfirmDialogTooManyLocationsWindowCancelClick: function ()
	{
		this.ppmObject.markerConfirmDialogTooManyLocationsWindow.close();
	},
	
	// TooPoorWindow
	handleTooPoorWindowBtCancelClick: function(divID)
	{		
		$(ppmObject.parentNode.id+divID).style.display='none';
		ppmObject.modalDialog=0;
	},
/*-------------------------------------------------------------------*/		

	moveToMarker: function(marker, callback)
	{
		if (marker.ppmObject.eagleView < 2) {
			marker.ppmObject.moveToGeo(marker.longitude, marker.latitude, marker.ppmObject.zoomLevel, callback);
		} else {
			if ($("ev_"+marker.icon.domId) != null 
			&& parseInt($("ev_"+marker.icon.domId).style.left) > 0
			&& parseInt($("ev_"+marker.icon.domId).style.top) > 0
			&& parseInt($("ev_"+marker.icon.domId).style.left) < marker.ppmObject.evWidth
			&& parseInt($("ev_"+marker.icon.domId).style.top) < marker.ppmObject.evHeight
			) {
				marker.icon.showInfoWindow ();
			} else {
				marker.ppmObject.evLeave ();
				marker.ppmObject.moveToGeo(marker.longitude, marker.latitude, marker.ppmObject.zoomLevel, callback);			
			}
		}
	},
	
	createNewMarker: function(xpos, ypos, longitude, latitude, name, description, draw, targetArray)
	{
		if(!targetArray) targetArray='user';
		path='http://'+location.hostname+'/kt_map/images/POI_markierung.png';
		width=25;
		height=31;
		offsetX=11;
		offsetY=27;
		
		if(targetArray=='user') {
			pmk=this.ppmObject.PpmMarkers.userMarkers;
			tp='user';
		} else {
			pmk=this.ppmObject.PpmMarkers.linkMarkers;
			tp='link';
		}

		var marker = new Marker($(this.ppmObject.parentNode.id+'_layer_1'), this.ppmObject.parentNode.id+'_marker_'+tp+'_'+(this.ppmObject.markerController.markerCounter), this.ppmObject);		
		marker.x=xpos-offsetX;
		marker.y=ypos-offsetY;
		marker.longitude=longitude;
		marker.latitude=latitude;
		marker.imagePath=path;
		marker.height=height;
		marker.width=width;
		marker.displayName=name;
		marker.description=description;
		marker.visible=true;
		marker.arrayOffset=(pmk.length);
		this.ppmObject.markerController.markerCounter++;


		var icon = new MarkerIcon (longitude, latitude, this.ppmObject, marker.myID, marker);
		icon.description = description;
		marker.icon = icon;
		this.lastMarkerFound = marker;

		if(targetArray=='user') {
			this.ppmObject.PpmMarkers.userMarkers.push (marker);
		} else {
			this.ppmObject.PpmMarkers.linkMarkers.push (marker);
		}	
	
		if(draw == true) {
			marker.draw();
		}
		return marker;
	},
	
	handleError: function(errorCode)
	{
		if(errorCode=='ERROR') {
			alert('Es ist ein allgemeiner Fehler aufgetreten.');
		} else if(errorCode=='TOO_MANY_LOCATIONS') {
			alert('Sie haben zu viele Standorte.');
		} else if(errorCode=='NOT_LOGGED_IN') {
			alert('Sie sind nicht bei MYDE eingeloggt!');
		} else if(errorCode=="INVALID_MARKER") {
			alert('Der Marker ist ung&uuml;ltig.');
		} else if (errorCode == "DOUBLE_ENTRIES") {
			alert('Doppelte Eintr&auml;ge sind nicht erlaubt.');
		} else {
			alert('Unbekannter Fehler: '+errorCode);
		}
	},
	
	locationSave: function (marker)
	{	this.zw = false;
		this.lastMarkerFound = marker;
		var url="http://"+location.hostname+this.ppmObject.ajaxPath+"marker"+this.ppmObject.ajaxExtension;
		var pars="op=convertToLocation&cid="+escape(marker.markerDBID)+"&rnd="+Math.random();
		mc=this;
		var myAjax=new Ajax.Request(url, {method:'get', parameters:pars, onComplete: function (obj) { mc.locationSaveComplete(obj, marker);}});
	},
	
	locationSaveComplete: function(obj, marker)
	{
		this.zw = false;
		var reX=obj.responseText;
		re=reX.split('|');
		if(re[0]!='OK') {
			if(re[0] == 'NOT_LOGGED_IN') {
				ppmObject.markerConfirmDialogLocationSaveWindow.open('Sie sind nicht eingeloggt','Sie m&uuml;ssen einen myklickTel Account besitzen und eingeloggt sein, um die Markierung "'+shortenString(marker.displayName, 16)+'" zu Ihren Standorten hinzuzuf&uuml;gen.');
			} else if(re[0] == 'TOO_MANY_LOCATIONS') {
				this.ppmObject.markerConfirmDialogLocationSaveWindow.close();
				ppmObject.markerConfirmDialogTooManyLocationsWindow.open('Zuviele Standorte','Sie haben bereits 10 Standorte festgelegt. Um die Markierung "'+shortenString(marker.displayName, 16)+'" zu Ihren Standorten hinzuzuf&uuml;gen, l&ouml;schen Sie bitte einen bereits vorhandenen Standort in Ihrer myklickTel Verwaltung.');
			} else {
				this.handleError(re[0]);
			}
		} else {
			marker.savedAsLocation=true;
			ppmObject.markerConfirmDialogLocationSaveWindow.close();
			ppmObject.markerInfoDialogWindow.open('Standort gespeichert','Die Markierung wurde als Standort gespeichert.');
		}
	},

	routeStart: function (marker)
	{	
		this.zw = false;
		this.ppmObject.addressMode = 0;
		$(this.ppmObject.parentNode.id+"_ppm_routing_input").show();
		
		
		this.streetnumber 	  = this.ppmObject.parentNode.id+'_streetnumber_a';
		this.housenumber	  = this.ppmObject.parentNode.id+'_housenumber_a';
		this.zipcity 		  = this.ppmObject.parentNode.id+'_zipcity_a';
		this.longitude_hidden = this.ppmObject.parentNode.id+'_longitude_a';
		this.latitude_hidden  = this.ppmObject.parentNode.id+'_latitude_a';
		this.displayName 	  = marker.displayName;
		this.longitude		  = marker.longitude;
		this.latitude 		  = marker.latitude;
		this.country		  = this.ppmObject.parentNode.id+'_country_a';
		
		this.displayName = this.displayName.replace(/&amp;/g, "&" );
		
		
		if (($F(this.streetnumber) == "Straße mit oder ohne Nummer") && (($F(this.zipcity) == "PLZ und/oder Ort") || ($F(this.zipcity) == "")) ||
		    ($F(this.streetnumber) == "" && $F(this.zipcity) == "") ||
		    ($F(this.streetnumber) != "Straße mit oder ohne Nummer") && ($F(this.zipcity) == "PLZ und/oder Ort")) {
			this.ppmObject.setRoute(this.streetnumber,
									this.housenumber,
									this.zipcity, 
									this.longitude_hidden, 
									this.latitude_hidden, 
									this.displayName, 
									this.longitude, 
									this.latitude,
									this.country);
										 
			this.ppmObject.markerInfoDialogWindow.open('&Uuml;bernahme erfolgreich', '"'+shortenString(marker.displayName, 16)+'" wurde als Start f&uuml;r Ihre Routenplanung &uuml;bernommen.');
			
		} else {
			this.ppmObject.markerConfirmDialogRoutingWindow.open('Routenstart bereits vorhanden', 'Sie haben bereits einen Start definiert. Wollen Sie diese Markierung wirklich als Start f&uuml;r Ihre Routenplanung &uuml;bernehmen?');			
		}
		
									
	},
	
	routeEnd: function (marker)
	{
		localLog (this.ppmObject.markerController.lastMarkerFound.dumpToString());
		this.zw = false;
		this.ppmObject.addressMode = 0;
		$(this.ppmObject.parentNode.id+"_ppm_routing_input").show();
		
		this.streetnumber 	  = this.ppmObject.parentNode.id+'_streetnumber_b';
		this.housenumber 	  = this.ppmObject.parentNode.id+'_housenumber_b';
		this.zipcity 		  = this.ppmObject.parentNode.id+'_zipcity_b';
		this.longitude_hidden = this.ppmObject.parentNode.id+'_longitude_b';
		this.latitude_hidden  = this.ppmObject.parentNode.id+'_latitude_b';
		this.country		  = this.ppmObject.parentNode.id+'_country_b';
		this.displayName	  = marker.displayName;
		this.longitude		  = marker.longitude;
		this.latitude		  = marker.latitude;
		
		if (($F(this.streetnumber) == "Straße mit oder ohne Nummer") && (($F(this.zipcity) == "PLZ und/oder Ort") || ($F(this.zipcity) == "")) ||
		    ($F(this.streetnumber) == "" && $F(this.zipcity) == "") ||
		    ($F(this.streetnumber) != "Straße mit oder ohne Nummer") && ($F(this.zipcity) == "PLZ und/oder Ort")) {
			this.ppmObject.setRoute(this.streetnumber,
									this.housenumber,
									this.zipcity, 
									this.longitude_hidden, 
									this.latitude_hidden, 
									this.displayName, 
									this.longitude, 
									this.latitude,
									this.country);
										 
			this.ppmObject.markerInfoDialogWindow.open('&Uuml;bernahme erfolgreich', '"'+this.displayName+'" wurde als Ziel f&uuml;r Ihre Routenplanung &uuml;bernommen.');
			
		} else {
			this.ppmObject.markerConfirmDialogRoutingWindow.open('Routenziel bereits vorhanden', 'Sie haben bereits ein Ziel definiert. Wollen Sie diese Markierung wirklich als Ziel f&uuml;r Ihre Routenplanung &uuml;bernehmen?');
		}
		
	},
	
	routeStop: function (marker)
	{
		this.zw = true;
		this.ppmObject.addressMode = 0;				
		$(this.ppmObject.parentNode.id+"_ppm_routing_input").show();
		
		
		this.streetnumber_z1 	 = this.ppmObject.parentNode.id+'_streetnumber_z1';
		this.housenumber_z1 	 = this.ppmObject.parentNode.id+'_housenumber_z1';
		this.zipcity_z1 	  	 = this.ppmObject.parentNode.id+'_zipcity_z1';
		this.longitude_hidden_z1 = this.ppmObject.parentNode.id+'_longitude_z1';
		this.latitude_hidden_z1  = this.ppmObject.parentNode.id+'_latitude_z1';
		this.country_z1			 = this.ppmObject.parentNode.id+'_country_z1';
		
		this.streetnumber_z2 	 = this.ppmObject.parentNode.id+'_streetnumber_z2';
		this.housenumber_z2 	 = this.ppmObject.parentNode.id+'_housenumber_z2';
		this.zipcity_z2 		 = this.ppmObject.parentNode.id+'_zipcity_z2';
		this.longitude_hidden_z2 = this.ppmObject.parentNode.id+'_longitude_z2';
		this.latitude_hidden_z2  = this.ppmObject.parentNode.id+'_latitude_z2';
		this.country_z2			 = this.ppmObject.parentNode.id+'_country_z2';
		
		this.streetnumber_z3 	 = this.ppmObject.parentNode.id+'_streetnumber_z3';
		this.housenumber_z3 	 = this.ppmObject.parentNode.id+'_housenumber_z3';
		this.zipcity_z3 		 = this.ppmObject.parentNode.id+'_zipcity_z3';
		this.longitude_hidden_z3 = this.ppmObject.parentNode.id+'_longitude_z3';
		this.latitude_hidden_z3  = this.ppmObject.parentNode.id+'_latitude_z3';
		this.country_z3			 = this.ppmObject.parentNode.id+'_country_z3';
						
		this.displayName	  	 = marker.displayName;
		this.longitude		 	 = marker.longitude;
		this.latitude		 	 = marker.latitude;
		
		
		if (($F(this.streetnumber_z1) == "Straße mit oder ohne Nummer") && (($F(this.zipcity_z1) == "PLZ und/oder Ort") || ($F(this.zipcity_z1) == "")) ||
		    ($F(this.streetnumber_z1) == "" && $F(this.zipcity_z1) == "") ||
		    ($F(this.streetnumber_z1) != "Straße mit oder ohne Nummer") && ($F(this.zipcity_z1) == "PLZ und/oder Ort")) {

		    this.ppmObject.setRoute(this.streetnumber_z1, 
		    						this.housenumber_z1,
									this.zipcity_z1, 
									this.longitude_hidden_z1, 
									this.latitude_hidden_z1, 
									this.displayName, 
									this.longitude, 
									this.latitude,
									this.country_z1);
							
			this.ppmObject.markerInfoDialogWindow.open('&Uuml;bernahme erfolgreich', '"'+this.displayName+'" wurde als Zwischenstation f&uuml;r Ihre Routenplanung &uuml;bernommen.');
			
		} else if (($F(this.streetnumber_z2) == "Straße mit oder ohne Nummer") && (($F(this.zipcity_z2) == "PLZ und/oder Ort") || ($F(this.zipcity_z2) == "")) ||
			       ($F(this.streetnumber_z2) == "" && $F(this.zipcity_z2) == "") ||
		    	   ($F(this.streetnumber_z2) != "Straße mit oder ohne Nummer") && ($F(this.zipcity_z2) == "PLZ und/oder Ort")) {
			
		    this.ppmObject.setRoute(this.streetnumber_z2, 
		    						this.housenumber_z2,
									this.zipcity_z2, 
									this.longitude_hidden_z2, 
									this.latitude_hidden_z2, 
									this.displayName, 
									this.longitude, 
									this.latitude,
									this.country_z2);
			
			// einblenden
			if ($(this.ppmObject.parentNode.id+'_navi_zstation2').style.display == 'none') {
				$(this.ppmObject.parentNode.id+'_navi_zstation2').style.display = '';
			}
			
			this.ppmObject.markerInfoDialogWindow.open('&Uuml;bernahme erfolgreich', '"'+this.displayName+'" wurde als Zwischenstation f&uuml;r Ihre Routenplanung &uuml;bernommen.');
		} else if (($F(this.streetnumber_z3) == "Straße mit oder ohne Nummer") && (($F(this.zipcity_z3) == "PLZ und/oder Ort") || ($F(this.zipcity_z3) == "")) ||
			       ($F(this.streetnumber_z3) == "" && $F(this.zipcity_z3) == "") ||
		    	   ($F(this.streetnumber_z3) != "Straße mit oder ohne Nummer") && ($F(this.zipcity_z3) == "PLZ und/oder Ort")) {
		    
			this.ppmObject.setRoute(this.streetnumber_z3,
									this.housenumber_z3,
									this.zipcity_z3, 
									this.longitude_hidden_z3, 
									this.latitude_hidden_z3, 
									this.displayName, 
									this.longitude, 
									this.latitude,
									this.country_z3); 
			// einblenden
			if ($(this.ppmObject.parentNode.id+'_navi_zstation3').style.display == 'none') {
				$(this.ppmObject.parentNode.id+'_navi_zstation3').style.display = '';
			}
			this.ppmObject.markerInfoDialogWindow.open('&Uuml;bernahme erfolgreich', '"'+this.displayName+'" wurde als Zwischenstation f&uuml;r Ihre Routenplanung &uuml;bernommen.');
			
		} else {
			this.ppmObject.markerInfoDialogWindow.open('Maximale Anzahl von Zwischenstationen &uum;berschritten', 'Sie k&ouml;nnen maximal 3 Zwischenstationen anlegen.');
		}
		
		if ($(this.ppmObject.parentNode.id+'_navi_zstation2').style.display != 'none' && $(this.ppmObject.parentNode.id+'_navi_zstation3').style.display != 'none') {
			$(this.ppmObject.parentNode.id+'_zbutton').style.display = 'none';
		}
		
		
	},
	
	email: function (marker)
	{
		this.zw = false;
		this.longitude   = marker.longitude;
		this.latitude    = marker.latitude;
		zoomLevel 		 = this.ppmObject.zoomLevel;
		eagleView 		 = this.ppmObject.eagleView;
		aerial 			 = this.ppmObject.aerial;
		hybrid 			 = this.ppmObject.hybrid;
		direction		 = this.ppmObject.evDirection;

		var mapType;
		if(ppmObject.hybrid)
		{
			mapType='hybrid';
		} else if(ppmObject.aerial) {
			mapType='aerial';
		} else if(ppmObject.eagleView) {
			mapType='eagleview';
			zoomLevel=ppmObject.evZoomLevel;			
		} else {
			mapType='map';
		}

		var url="http://"+location.hostname+this.ppmObject.ajaxPath+"getMarkerLink"+this.ppmObject.ajaxExtension;

		// Centers around the marker
		var pars = 'type=one&dom='+escape(location.hostname)+"&path="+escape(location.pathname)+"&maptype="+mapType+"&longitude="+marker.longitude+"&latitude="+marker.latitude+"&zoomlevel="+zoomLevel+"&cid="+(marker.markerDBID)+"&dir="+direction+"&rnd="+Math.random();
			
		mc=this;
		var myAjax=new Ajax.Request(url, {method:'get', parameters:pars, onComplete: function (obj) { mc.emailGetLinkComplete(obj, marker, ppmObject);}});
		this.ppmObject.contextMenuController.hideDynamicMenu();
		 
	},
	
	emailGetLinkComplete:function(obj, marker, ppmObject)
	{
		this.zw = false;
		this.ppmObject=ppmObject;
		var reX=obj.responseText;
		re=reX.split('|');
		if(re[0]!='OK') {
			this.handleError(re[0]);
		} else {
			top.location.href="mailto:?subject=Markierungen%20bei%20klickTel&body=Um%20die%20Ihnen%20zugesandte%20Markierung%20bei%20klickTel%20aufzurufen,%20klicken%20Sie%20bitte%20auf%20den%20nachfolgenden%20Link:%0A%0A"+re[1]+"%0A%0A%0A%0AMarkieren%20Sie%20Ihre%20Lieblingsorte%20auf%20http://www.klicktel.de%20!%0ARoutenplaner%20und%20lokale%20Suche%20sind%20ein%20kostenloser%20Service%20der%20klickTel%20AG.";
			this.ppmObject.urchinLog(217);
		}
	
	},
	
	toggleParking: function (marker)
	{
		this.zw = false;
		ppmObject=this.ppmObject;
		if(this.dynamicOptions.parking == 1) {
			this.dynamicOptions.parking=0;
			this.staticPoiids.parking.each(function(id) {
				ppmObject.poi.staticPoi=this.ppmObject.poi.staticPoi.without(id);
			});
		} else {
			this.dynamicOptions.parking=1;
			this.staticPoiids.parking.each(function(id) {
				ppmObject.poi.staticPoi.push(id);
			});
			
			if(this.ppmObject.eagleView == 2) {
				this.ppmObject.evLeave();
				this.ppmObject.setZoomLevel(4);
			}
			if(this.ppmObject.zoomLevel > 4) this.ppmObject.setZoomLevel(4);
		}
		this.moveToMarker(marker, function() { this.ppmObject.draw(); });
	},
	
	toggleHotels: function (marker)
	{
		this.zw = false;
		braids=this.braids;
		ppmObject=this.ppmObject;
		if(this.dynamicOptions.hotels == 1) {
			this.dynamicOptions.hotels=0;
			ppmObject.poi.braIds=ppmObject.poi.braIds.without(braids.hotel);
			this.moveToMarker(marker, function () {ppmObject.draw ()});
		} else {
			this.dynamicOptions.hotels=1;
			if(this.ppmObject.eagleView == 2) {
				this.ppmObject.evLeave();
				this.ppmObject.setZoomLevel(4);
			}
			if(this.ppmObject.zoomLevel > 4) this.ppmObject.setZoomLevel(4);
			
			this.moveToMarker(marker, function() { if(ppmObject.poi.braIds.indexOf(braids.hotel) == -1) ppmObject.poi.braIds.push(braids.hotel); ppmObject.updatePoiLayer(); });
		}
	},
    //
	toggleRestaurants: function (marker)
	{
		this.zw = false;
		braids=this.braids;
		ppmObject=this.ppmObject;
		if(this.dynamicOptions.restaurants == 1) {
			this.dynamicOptions.restaurants=0;
			this.ppmObject.poi.braIds=ppmObject.poi.braIds.without(braids.restaurant);
			this.moveToMarker(marker, function() { ppmObject.draw(); });
		} else {
			this.dynamicOptions.restaurants=1;
			if(this.ppmObject.eagleView == 2) {
				this.ppmObject.evLeave();
				this.ppmObject.setZoomLevel(4);
			}
			if(this.ppmObject.zoomLevel > 4) this.ppmObject.setZoomLevel(4);
			this.moveToMarker(marker, function() { if(ppmObject.poi.braIds.indexOf(braids.restaurant) == -1) ppmObject.poi.braIds.push(braids.restaurant); ppmObject.updatePoiLayer(); });
		}
	}
});



Marker = GeoObject.extend ({

	imageX:0,
	imageY:0,
	imagePath:'',
	myID:'',
	displayName:'',
	name:'',
	description:'',
	visible:false,
	arrayOffset:0,
	offsetX:12,
	offsetY:25,
	icon: null,
	markerDBID:'',
	savedAsLocation:false,
	isPersistent:false,
	pppmObject:null,
	poiID:null,
	refID:null,
	isMine:0,
	
	constructor: function (parentNode, id, ppmObject) {
		this.ppmObject=ppmObject;
		this.myID=id;
		this.domNode = document.createElement('div');
		this.domNode.setAttribute("id", id)
		this.domNode.style.position = "absolute";
		this.parentNode = parentNode;
		this.width = 32;
		this.height = 32;
	},
	
	urlEncode: function(sStr) {
	   return sStr;
	},
	
	showInfoWindow: function(ppmObject)
	{	
		this.icon.showInfoWindow();
		return;
	},
	
	setPosition: function (longitude, latitude){
		this.longitude=longitude;
		this.latitude=latitude;
		this.icon.longitude=longitude;
		this.icon.latitude=latitude;
	},
	
	
	dumpToString: function()
	{
		markerString='myID: '+this.myID+', isMine: '+this.isMine+', displayName: '+this.displayName+', description: '+this.description;
		markerString+=', arrayOffset: '+this.arrayOffset+', markerDBID: '+this.markerDBID+', poiID: '+this.poiID+', refID: '+this.refID;
		return markerString;
	},
	
	
	
	makePersistent: function(op, ppmObject, marker)
	{	
		ppmObject.processes++;
		this.ppmObject=ppmObject;
		var url = 'http://'+location.hostname+this.ppmObject.ajaxPath+'marker'+this.ppmObject.ajaxExtension;
		if(op=='save' || op=='update') {
			var pars = 'op='+op+
				'&id='+encodeURIComponent(this.myID) + 
				'&longitude='+encodeURIComponent(this.longitude) + 
				'&latitude='+encodeURIComponent(this.latitude) + 
				'&displayName='+encodeURIComponent(this.displayName) + 
				'&description='+encodeURIComponent(this.description);
				pars+="&poi="+encodeURIComponent(this.poiID);
				pars+="&refid="+this.refID;
				pars+="&_rnd="+Math.random();
				if(op=='update') pars+='&cid='+this.urlEncode(this.markerDBID);
		} else if(op=='getAll' || op == 'deleteAll') {
			var pars='op='+op;
			
		} else {
			var pars='op='+op+'&cid='+this.urlEncode(this.markerDBID);
			pars+="&poi="+encodeURIComponent(this.poiID);
		}
			marker = this;
		var myAjax = new Ajax.Request( url, { method: 'post', parameters: pars,  onComplete: function(obj) { marker.showResponse(obj, op, ppmObject, marker.myID);}}); 
	},
	
	showResponse: function (obj, op, ppmObject, markerID) {
		ppmObject.processes--;
		this.ppmObject=ppmObject;
		var f=obj.responseText.split("|");
		var errorCode=f[0];
		var mID=f[1];
		var cID=f[2];
		this.markerDBID=cID;
		if(cID=='') {
			this.markerDBID=markerID;
		}

		if((op=='delete') && errorCode == 'OK') {
			if($(this.myID) != null) {
				$(this.myID).style.display='none';
			}

			// Delete from eagleview
			if($('ev_'+this.myID) != null) {
				Element.remove($('ev_'+this.myID));
			}

			if(this.ppmObject.PpmMarkers.userMarkers[this.arrayOffset] != null) {
				this.ppmObject.PpmMarkers.userMarkers[this.arrayOffset].visible=false;
				
				// Is the user´s own user marker in the link markers´ array as well?			
				thisOne=this.ppmObject.findMarkerByID(this.ppmObject.PpmMarkers.linkMarkers, this.ppmObject.PpmMarkers.userMarkers[this.arrayOffset].markerDBID);
				if(thisOne != null) {
					domId = thisOne.myID;
					this.ppmObject.icons = this.ppmObject.icons.reject(function (icon) {
						 return (icon.domId == domId);
					});

					this.ppmObject.PpmMarkers.linkMarkers = this.ppmObject.PpmMarkers.linkMarkers.reject(function (marker) {
						 return (marker.myID == domId);
					});
					
					ppmObject.PpmMarkers.linkMarkers=ppmObject.markerController.fixMarkerArrayPositions(ppmObject.PpmMarkers.linkMarkers);
					Element.remove($(thisOne.myID));

					if($(this.ppmObject.parentNode.id+'_ScratchPadMarkerEntry_link_'+thisOne.myID) != null) {
						Element.remove($(this.ppmObject.parentNode.id+'_ScratchPadMarkerEntry_link_'+thisOne.myID));
					}
					this.ppmObject.scratchPads.linkMarkers.update();
					ppmObject.irqTasks.updateScratchpads=true;
				}
			}
	
			this.ppmObject.scratchPads.userMarkers.update();
			this.ppmObject.contextMenuController.hideDynamicMenu();

			// Delete from Markers Array
			this.ppmObject.PpmMarkers.userMarkers.splice (this.arrayOffset, 1);
			if(this.ppmObject.PpmMarkers.userMarkers == null) {
				this.ppmObject.PpmMarkers.userMarkers = Array ();
			}

			// Delete from Icons Array
			domId = this.myID;
			this.ppmObject.icons = this.ppmObject.icons.reject(function (icon) {
				 return (icon.domId == domId);
			});

			ppmObject.PpmMarkers.userMarkers=ppmObject.markerController.fixMarkerArrayPositions(ppmObject.PpmMarkers.userMarkers);
			Element.remove($(this.myID));
			
			if(this.ppmObject.PpmMarkers.userMarkers == null) {
				this.ppmObject.PpmMarkers.userMarkers = Array ();
			}
			
			
		} else if (op=='save' && errorCode == 'OK') {
			this.ppmObject.scratchPads.userMarkers.update();
		}
		if(errorCode != "OK") {
			this.ppmObject.markerController.handleError(errorCode);
		}
	}
	
});

Marker.implement (ScreenObject);

Marker.implement ({
	draw: function () {
		this.icon.draw ();
		this.visible=true;
	}
});





MarkerInputWindow = Base.extend ({
	
	isOpen:0,
	ppmObject:null,
	divID:null,
	displayName:'',
	description:'',
	centered:0,
	text:new Array(),
	formattedText:'',
	btDisabled:false,
	
	constructor: function (ppmObject, divID) {		
		this.isOpen=0;
		this.divID=divID;
		this.ppmObject=ppmObject;
	},
	
	close: function()
	{	
		if(this.isOpen == 1) {
			new Effect.Fade($(this.divID), {duration:0.3});
			this.isOpen=0;
		}
	},
	
	setAndClose: function(marker)
	{
		this.set(marker);	
		this.close();
	},
	
	open: function(marker)
	{
		this.ppmObject.cleanupUI();
		
		this.update();
		if(this.isOpen == 0) {
			/*if(this.centered == 0) {
				centerDivInDiv($(this.divID), $(this.ppmObject.parentNode.id));
				this.centered=1;
			}*/
			divID=this.divID;
			ppmObject=this.ppmObject;
			
			divDim = Element.getDimensions($(divID));
			mapDim   = Element.getDimensions(this.ppmObject.parentNode.id);
			leftDim  = Element.getDimensions(this.ppmObject.parentNode.id+'_optionsleiste_links');
			rightDim = Element.getDimensions(this.ppmObject.parentNode.id+'_optionsleiste_rechts');
	
			centerDimWidth = mapDim.width - leftDim.width - rightDim.width;		
			marginLeft = Math.round((centerDimWidth - divDim.width)/2);
	
			newX = leftDim.width + marginLeft - 3;			
			newY = 26;
			
			$(divID).style.position = 'absolute';
			$(divID).style.top = newY+5+'px';
			$(divID).style.left = newX+'px';
			
			new Effect.Appear($(this.divID), {duration:0.2, afterFinish:function(){ ppmObject.makeModal(divID);}});	
			this.isOpen=1;
		}
	},
	
	
	set: function(marker)
	{	
		this.displayName=$F(this.divID+"_Form_Name");
		this.description=$F(this.divID+"_Form_Desc");
		
		if(marker != null) {
			marker.displayName=this.displayName;
			marker.description=this.description;
			marker.icon.title=marker.displayName;
		}
		
	},

	update: function()
	{	
		$(this.divID+"_Form_Name").value=this.displayName;
		$(this.divID+"_Form_Desc").value=this.description;		
	}
	
});



MarkerAddWindow = MarkerInputWindow.extend ({
	
	open: function()
	{	
		$(this.ppmObject.parentNode.id+'_markerAddWindow_Form_BtSet').disabled = false; // enable "save"-button	
		this.displayName='Markierung '+(this.ppmObject.markerController.markerCounter);
		this.description='';		
		this.base();
		this.ppmObject.contextMenuController.hideDynamicMenu();
	}
		
});


MarkerEditWindow = MarkerInputWindow.extend ({

	open: function(marker)
	{
		if(marker != null) {
			this.displayName=marker.displayName;
			this.description=marker.description;
		}
		this.base(marker);
	}
	
});


