;-- TIME_STAMP   2020-05-16 00:04:49   v 0.1

#Region ; Includes
#include <ColorConstants.au3>
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <Excel.au3>
#include <IE.au3>
#include <OutlookEx.au3>
#EndRegion ; Includes

Opt('MustDeclareVars', 1)

#Region ; Globale Variablen
;***************************************************************************************
; Dateien Pfad ApiKey evtl. ändern                                                    ;*
Global $g_ApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"                                 ;*
; Quelldatei von Winitas CSV                                                          ;*
Global $g_sQuelldatei = "C:\Users\xx2\Documents\\Export\Aufträge.csv"                 ;* @MyDocumentsDir = "C:\Users\xx2\Documents"
; Zieldatei AATour.gpx für ITN Converter                                              ;*
Global $g_sZieldatei = "C:\Users\xx2\Desktop\AATour.gpx"                              ;* @DesktopDir = "C:\Users\xx2\Desktop"
; My Drive Connect                                                                    ;*
Global $g_sMyDriveConnect = "C:\Users\xx2\MyDrive Connect\TomTom MyDrive Connect.exe" ;* @UserProfileDir = "C:\Users\xx2"
;***************************************************************************************

; Excel öffnen *** WinActivate($oWorkBook, "") <<<=== Das geht nicht, denn WinActivate erwartet ein $hWnd/$sTitle/$sClassName und kein Objekt!!!
Global $oExcel = _Excel_Open(True)    ; Excel starten und in den Vordergrund holen
Global $oWorkBook = _Excel_BookOpen($oExcel, $g_sQuelldatei) ; Arbeitsmappe öffnen

Global $g_hForm1, $g_idButton1, $g_idButton2, $g_idButton3, $g_idButton4
#EndRegion ; Globale Variablen

_Main()

Func _Main()
	; Fenster_Excel() ; Funktion prüfen ob Excel.exe offen ist
	If ProcessExists("Excel.exe") Then MsgBox(0, "ExcelDateien schließen", "")

	#Region ; GUI für Tourenplanung
	; Ganzer Bildschirm freischalten
	;GUICreate($Ersteller, @DesktopWidth, @DesktopHeight, 0, 0,$WS_MAXIMIZEBOX+$WS_MAXIMIZE)
	$g_hForm1 = GUICreate("Tourenplanung ", 500, 300, 800, 500)
	$g_idButton1 = GUICtrlCreateButton("MyDrive Connect laden", 150, 50, 200, 30)
	$g_idButton2 = GUICtrlCreateButton("Adressen Import", 150, 100, 200, 30)
	$g_idButton3 = GUICtrlCreateButton("Mail mit Telefonnummern", 150, 150, 200, 30)
	$g_idButton4 = GUICtrlCreateButton("Ende", 150, 200, 200, 30)
;~ WinSetOnTop($g_hForm1,"",1) ; Fenster im Vordergrund
	GUISetBkColor($COLOR_Silver) ; Farbe Sibergrau
;~ GUIStartGroup()
	GUISetState()
	#EndRegion ; GUI für Tourenplanung

	Local $nMsg

	While 2
		$nMsg = GUIGetMsg() ; X = Ende
		Switch $nMsg
			Case $GUI_EVENT_CLOSE, $g_idButton4 ; Ende, Aus und Schluß!
				Exit

			Case $g_idButton1 ; MyDrive Connect laden
				ShellExecute($g_sMyDriveConnect, "-startda", "", "open", @SW_SHOWMINIMIZED) ; My Drive Connect mit Parameter "-startda" starten

				;If _TomTomConnected() Then ConsoleWrite("... TomTom ist verbunden ..." & @CRLF)
				MsgBox(0, @ScriptName, "TomTom ist " & (_TomTomConnected() = 2 ? "" : "nicht") & " verbunden!")

			Case $g_idButton2 ; Adressen Import
				;Quell_vorhanden() ; Funktion ob alte Quelldatei vorhanden
				;Mausklick() ; Funktion Mauscklick

				;FileMove ( $Quell , $Ziel ,0)
				;FileDelete ($Quell)

				;SuchNavi()        ; Funtion My Drive Connect mit Parameter "-startda" starten
				Winitas_Datei()   ; Funktion Winitas Datei bearbeiten
				Lat_Lon()         ; Funktion Lat und Lon berechnen
				AATour()          ; Funtion AATour.gpx einlesen

				Dateien_loeschen() ; alle Daten löschen
				_Excel_BookSaveAs($oWorkBook, "", $xlHtml, True)


			Case $g_idButton3 ; Mail mit Telefonnummern
				Local $oOutlook, $oItem, $sMeineMailadresse = "xxxx@gmx.de", $sBetreff, $aTermine, $sBody

				$oOutlook = _OL_Open()
				If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)

				$sBetreff = "Telefonnummern Kunden Tour " & _NowDate()
				$aTermine = __ParseCSV($g_sQuelldatei, ';') ; <== Name der Eingabedatei oben bei den globalen Variablen anpassen!!!

				$sBody = "<html><body>"
				For $i = 1 To UBound($aTermine) - 1
					If $aTermine[$i][0] <> "" Then ; ignoriere leere Zeilen
						$sBody &= "<P><b><u>" & $aTermine[$i][1] & "</u></b><br>" ; Vorname & Name
						$sBody &= $aTermine[$i][2] & "<br>" ; Straße
						$sBody &= StringFormat('%05i %s<br>', $aTermine[$i][3], $aTermine[$i][4]) ; PLZ & Ort, (PLZ 5 muss immer 5-stellig sein!)
						If $aTermine[$i][5] <> "" Then $sBody &= "Privat: " & $aTermine[$i][5] & "<br>" ; Telefonnr 1
						If $aTermine[$i][6] <> "" Then $sBody &= "Firma:  " & $aTermine[$i][6] & "<br>" ; Telefonnr 2
						If $aTermine[$i][7] <> "" Then $sBody &= "Mobil:  " & $aTermine[$i][7] & "<br>" ; Handy
					EndIf
				Next
				$sBody &= "</html></body>"

				$oItem = _OL_ItemCreate($oOutlook, $olMailItem, "", "", "Subject=" & $sBetreff, "BodyFormat=" & $olFormatHTML, "HTMLBody=" & $sBody)
				If @error <> 0 Then Exit MsgBox(16, "", "Item Create: @error = " & @error & ", @extended = " & @extended)
				_OL_ItemRecipientAdd($oOutlook, $oItem, Default, $olTo, $sMeineMailadresse)
				If @error <> 0 Then Exit MsgBox(16, "", "Recipient Add: @error = " & @error & ", @extended = " & @extended)
				; $oItem.send ; sendet ohne Nachfrage
				$oItem.display ; zeigt die Mail an
		EndSwitch
	WEnd
EndFunc   ;==>_Main



;**************************************************************
; Alle Funktionen                                             *
;**************************************************************

Func _TomTomConnected()
	Local Static $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
	Local $colItems = "", $strComputer = "."
	Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\")
	If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
	$colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter Where Name="TomTom" AND NetConnectionStatus=2', "WQL", _
			$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
	For $objItem In $colItems
		Return $objItem.NetConnectionStatus
	Next
	Return SetError(2, 0, 0)
EndFunc   ;==>_TomTomConnected

;Func SuchNavi() ; Navi anmelden bei TomTom
;   ShellExecute($g_sMyDriveConnect,"-startda","","open",@SW_Hide) ; My Drive Connect mit Parameter "-startda" starten
;   MsgBox(64,"Title","Schließe das Tom Tom Navigationsgerät an USB an"&@crlf&"und warte bis es verbunden ist")
;ShellExecute($g_sMyDriveConnect,"-startda","","open",@SW_SHOW) ; My Drive Connect mit Parameter "-startda" starten
;EndFunc

Func Winitas_Datei()
	; Überflüssige Reihen löschen
	Local Static $aRanges = ["A:A", "B:B", "C:C", "F:F", "I:M"]
	For $i = 0 To UBound($aRanges) - 1 Step 1
		_Excel_RangeDelete($oWorkBook.ActiveSheet, $aRanges[$i])
	Next

	; Neue Überschriften
	Local Static $aHeadlines = ["Nummer", "Name", "Straße", "PLZ", "Ort", "Handy", "Lat", "Lon"]
	For $i = 0 To UBound($aRanges) - 1 Step 1
		$oExcel.ActiveSheet.Cells(1, $i + 1) = $aHeadlines[$i]
	Next

	; Prüfen ob PLZ Leer dann Zeile löschen
	For $r = 2 To $oExcel.ActiveSheet.Cells($oExcel.Rows.Count, 2).End(-4162).Row ; -4162 = xlUp
		If _Excel_RangeRead($oWorkBook, Default, "D" & $r) = 0 Then
			_Excel_RangeDelete($oWorkBook.ActiveSheet, $r & ":" & $r, $xlShiftUp)
		EndIf
	Next
EndFunc   ;==>Winitas_Datei

Func Lat_Lon()   ; Funktion Lat und Lon berechnen
	Local $Adresse, $Strasse, $PLZ, $Ort, $url, $strXML, $Pos1, $Pos2, $Diff1, $Lat, $Lon
	; Suche letzte Zeile
	For $r = 2 To $oExcel.ActiveSheet.Cells($oExcel.Rows.Count, 2).End(-4162).Row ; -4162 = xlUp
		$Strasse = _Excel_RangeRead($oWorkBook, Default, "C" & $r)
		$PLZ = StringFormat('%05i', _Excel_RangeRead($oWorkBook, Default, "D" & $r)) ; DE-PLZ sind immer 5-stellig
		$Ort = _Excel_RangeRead($oWorkBook, Default, "E" & $r)

		$Adresse = $Strasse & "," & + $PLZ & " " & + $Ort

		$oExcel.Cells($r, 9).NumberFormat = "@"
		$oExcel.Cells($r, 10).NumberFormat = "@"

		; XML Ausgabe = .xml
		; Sprache = &countrySet=DEU
		;MsgBox (0, "Url " , $Url)
		$url = ("https://api.tomtom.com/search/2/geocode/&" & $Adresse & ".xml?key=" & $g_ApiKey & "&countrySet=DEU")
		;MsgBox (0, "Url " , $Url)

		;Sleep ( 100 )

;~ 		InetGet($url, "Koordinaten.xml") ;  Internet Seite speichern
;~ 		$strXML = FileRead("Koordinaten.xml")
		; Besser so, dann brauchst du die Daten nicht in eine Datei speichern, wenn du sie eh überschreibst.
		$strXML = BinaryToString(InetRead($url)) ;  Internet Seite in Variable laden
		;MsgBox (0, "string " , $strXML)

		; Lat extrahieren
		$Lat = StringRegExpReplace($strXML, '.+<lat>(.+)</lat>.+', '\1') ;  Lat Position für Navi = 54.985112
;~ 		;MsgBox (0, "Lat " , $Lat)

		; Lon extrahieren
		$Lon = StringRegExpReplace($strXML, '.+<lon>(.+)</lon>.+', '\1') ;  Lon Position für Navi = 6.559423
;~ 		;MsgBox (0, "Lon " , $Lon)

		; Wert für $Lat in Spalte I schreiben
		_Excel_RangeWrite($oWorkBook, $oWorkBook.Activesheet, $Lat, "I" & $r)
		; Wert für $Lon in Spalte J schreiben
		_Excel_RangeWrite($oWorkBook, $oWorkBook.Activesheet, $Lon, "J" & $r)
		$oExcel.Columns("A:J").AutoFit ; Blatt auf Zellenbreite formatieren
	Next
	ProcessClose("iexplore.exe") ; Internet Explorer schließen
EndFunc   ;==>Lat_Lon

Func AATour()
	; Funtion AATour.gpx anlegen und einlesen
	Local $hGPXdatei = FileOpen($g_sZieldatei, 1), $Nummer, $Name, $Strasse, $PLZ, $Ort, $Lat, $Lon, $sText
	; Kopftext
	$sText = "<?xml version=" & '"' & 1.0 & '"' & "?>" & @CRLF
	$sText &= "<gpx xmlns=" & '"http://www.topografix.com/GPX/1/1"' & " creator=" & '"TVG-Verlag"' & " version=" & '"1.1"' & " xmlns:xsi=" & '"http://www.w3.org/2001/XMLSchema-instance"' & @CRLF
	$sText &= "xsi:schemaLocation=" & '"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"' & ">" & @CRLF
	$sText &= "	<metadata>" & @CRLF
	$sText &= "		<link href=" & '"http://www.tvg-verlag.de/"' & ">" & @CRLF
	$sText &= "			<text>TVG-Verlag</text></link>" & @CRLF
	$sText &= "	</metadata>" & @CRLF
	$sText &= "	<rte>" & @CRLF
	$sText &= "		<name>RouteNavigator Europa - Route</name>" & @CRLF
	$sText &= "        <desc></desc>" & @CRLF

	For $r = 2 To $oExcel.ActiveSheet.Cells($oExcel.Rows.Count, 2).End(-4162).Row ; -4162 = xlUp
		$Nummer = _Excel_RangeRead($oWorkBook, Default, "A" & $r)
		$Name = _Excel_RangeRead($oWorkBook, Default, "B" & $r)
		$Strasse = _Excel_RangeRead($oWorkBook, Default, "C" & $r)
		$PLZ = _Excel_RangeRead($oWorkBook, Default, "D" & $r)
		$Ort = _Excel_RangeRead($oWorkBook, Default, "E" & $r)
		$Lat = StringRegExpReplace(_Excel_RangeRead($oWorkBook, Default, "I" & $r), "\R", "")      ; "\R" = "\r\n|\r|\n"
		$Lon = StringRegExpReplace(_Excel_RangeRead($oWorkBook, Default, "J" & $r), "\R", "")

		; Lat und Lon
		$sText &= "<rtept lat=" & '"' & $Lat & '"' & " " & "lon=" & '"' & $Lon & '"' & ">" & @CRLF
		; Adresse
		$sText &= "<name>" & $Nummer & "; " & $Name & "; " & $PLZ & " " & $Ort & "</name>" & @CRLF
		; Text für zwischen den Kunden
		$sText &= "</rtept>"
	Next
	; Abschlußtext
	$sText &= "</rte>" & @CRLF & "</gpx>" & @CRLF
	FileWrite($hGPXdatei, $sText)
	; Datei AATour.pgx schließen
	FileClose($hGPXdatei)
	; Datei nach ITN Converter
	ShellExecute($g_sZieldatei)

	Converter() ; ITN Converter Funtion
EndFunc   ;==>AATour

Func Converter()
	Local $hWnd, $oIE
	; ITN Converter Fenster
	$hWnd = _ActivateWindow("ITN Converter", "")
	ControlClick($hWnd, "", "[CLASS:ComboBox; INSTANCE:1]")
	; Exportieren Button
	ControlClick($hWnd, "", "[Class:Button;Instance:3]")
	; Fenster Exportieren
	$hWnd = _ActivateWindow("Exportieren", "")
	Sleep(500)
	ControlClick($hWnd, "", "[Class:Button;Instance:2]")
	; ITN Converter schließen
	$hWnd = _ActivateWindow("ITN Converter")
	ControlClick($hWnd, "", "[Class:Button;Instance:1]")

	; Tom Tom Link zum einfügen in Navi öffnen
	$oIE = _IECreate("http://169.254.255.1/pcmi/?locale=de_de") ; Wozu soll das gut sein, denn das Objekt wird nur an dieser Stelle hier benutzt?
	_IELoadWait($oIE)
	Sleep(1000)
EndFunc   ;==>Converter

Func _ActivateWindow($sTitle, $sText = '')
	Local $hWnd = WinActivate($sTitle, $sText)
	If Not IsHWnd($hWnd) Then $hWnd = WinWaitActive($sTitle, $sText, 3) ; 3 Sek., wartet sonst ewig!
	Return $hWnd
EndFunc   ;==>_ActivateWindow

Func Dateien_loeschen()
	Local Static $aDelete = [$g_sZieldatei] ; So ist es viel 'dynamischer'!
	; PS: $g_sZieldatei = "C:\Users\xx2\Desktop\AATour.gpx"
	; "Koordinaten.XML" gibt es nicht mehr, weil InetRead direkt in Variable speichert. "AATour.ov2" gibt es auch nirgend!?
	For $i = 0 To UBound($aDelete) - 1 Step 1
		FileDelete($aDelete[$i])
	Next
EndFunc   ;==>Dateien_loeschen
