; =============================================================================
; HotPrice 0.61a
; 7. August 2011
; =============================================================================
; Dieses Script ruft selbstständig aktuelle Sonderangebote ab
; Es besteht die Möglichkeit, bei gesuchten Produkten benachrichtigt zu werden
; =============================================================================
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <INet.au3>
#include <String.au3>
#include <Array.au3>
; Einstellungen
Global $UseZack
Global $NoticeUpdate
Global $UseTrayTip
Global $UseSound
Global $MessageBox
Global $Selective
Global $SelectivePArray
Global $GUIActive
Global $data_zack
; Intervall für Aktualisierung, Einstellung in GUI folgt
TraySetToolTip("HotPrice - Zeichne Benutzeroberfläche");
; TrayMenü-Einträge anpassen
Opt("TrayMenuMode", 1)
$show = TrayCreateItem("Nochmal anzeigen")
$refr = TrayCreateItem("Aktualisieren")
$conf = TrayCreateItem("Konfiguration")
$ends = TrayCreateItem("Beenden")
; Erzeuge GUI
$Form1_1 = GUICreate("Benachrichtigungsoptionen", 501, 321, 360, 285)
$Group1 = GUICtrlCreateGroup("Verbindung", 8, 8, 209, 65)
$Checkbox1 = GUICtrlCreateCheckbox("ZackZack", 16, 24, 97, 17)
$Checkbox7 = GUICtrlCreateCheckbox("Mindstar (Mindfactory)", 16, 48, 145, 17)
; Mindfactory Mindstar wird derzeit nicht unterstützt
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Benachrichtigung", 8, 80, 209, 169)
$Checkbox2 = GUICtrlCreateCheckbox("Bei Update benachrichtigen", 16, 96, 185, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Verwende TrayTip", 16, 120, 137, 17)
$Checkbox4 = GUICtrlCreateCheckbox("Akustische Benachrichtigung", 16, 144, 177, 17)
$Checkbox5 = GUICtrlCreateCheckbox("Meldungsfenster öffnen", 16, 168, 161, 17)
$Checkbox6 = GUICtrlCreateCheckbox("Selektive Benachrichtigung", 16, 192, 169, 17)
$Input1 = GUICtrlCreateInput("", 112, 216, 73, 21)
$Label5 = GUICtrlCreateLabel("Intervall (Minuten):", 16, 216, 91, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group3 = GUICtrlCreateGroup("Selektive Benachrichtigung", 232, 8, 257, 241)
$Edit1 = GUICtrlCreateEdit("", 240, 48, 241, 185)
$Label1 = GUICtrlCreateLabel("Suchmuster (1 pro Zeile)", 240, 24, 243, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Speichern", 8, 256, 209, 25, 0)
$Button2 = GUICtrlCreateButton("Verstecken", 8, 288, 209, 25, 0)
$Group4 = GUICtrlCreateGroup("Über HotPrice", 232, 256, 257, 57)
$Label2 = GUICtrlCreateLabel("Version 0.61a", 240, 272, 213, 17)
$Label3 = GUICtrlCreateLabel("", 240, 288, 4, 4)
$Label4 = GUICtrlCreateLabel("7. August 2011", 240, 288, 114, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
TraySetToolTip("HotPrice - Lade Konfiguration");
; Überprüfe, ob Konfigurationsdatei existiert
if Not FileExists(@ScriptDir & "\config.ini") Then
	IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
	IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "10")
	IniWrite(@ScriptDir & "\config.ini", "Selective", "Line1", "")
	; Wenn ja, dann war das der Erststart
	$firstrun = 1;
Else
	; Wenn nein, dann wurde das Programm bereits ausgeführt
	$firstrun = 0;
EndIf
; Lese gespeicherte Werte aus
$UseZack = IniRead(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "")
$NoticeUpdate = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "")
$UseTrayTip = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "")
$UseSound = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "")
$MessageBox = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "")
$Selective = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "")
$interval = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "")
; Selektive Benachrichtigung wird etwas schwieriger, da variable Anzahl von Suchstrings
; Erste Zeile: Zeile 1
$i = 1
; Erzeuge Array der Länge 1, da 0 nicht möglich.
Dim $SelectivePArray[1]
; Pseudoendlosschleife, wird abgebrochen, wenn keine Zeile mehr vorhanden ist
while True
	$pattern = IniRead(@ScriptDir & "\config.ini", "Selective", "Line"&$i, "")
	if $pattern = '' Then
		ExitLoop
	Else
		_ArrayAdd ($SelectivePArray, $pattern)
	EndIf
	$i = $i+1;
WEnd
; Lösche ersten Eintrag
_ArrayDelete($SelectivePArray, '')
; Text für Bearbeitung wird generiert
$SelectivePattern = _ArrayToString($SelectivePArray, @CRLF)
; Setze GUI-Anzeigeelemente
if $UseZack == 1 Then
	GUICtrlSetState($Checkbox1, $GUI_CHECKED)
EndIf
if $NoticeUpdate == 1 Then
	GUICtrlSetState($Checkbox2, $GUI_CHECKED)
EndIf		
if $UseTrayTip == 1 Then
	GUICtrlSetState($Checkbox3, $GUI_CHECKED)
EndIf	
if $UseSound == 1 Then
	GUICtrlSetState($Checkbox4, $GUI_CHECKED)
EndIf		
if $MessageBox == 1 Then
	GUICtrlSetState($Checkbox5, $GUI_CHECKED)
EndIf		
if $Selective == 1 Then
	GUICtrlSetState($Checkbox6, $GUI_CHECKED)
EndIf
GUICtrlSetData($Edit1, $SelectivePattern);
GUICtrlSetData($Input1, $interval);
; Prüfe, ob Erststart
If $firstrun = 1 Then
	; Wenn ja, zeige GUI und überspringe ersten Abruf
	GUISetState(@SW_SHOW)
	$GUIActive = 1;
	TraySetToolTip("Erststart - Konfiguration");
Else
	; Wenn nein, verstecke GUI und beginne mit Abruf
	GUISetState(@SW_HIDE)
	$GUIActive = 0;
	$timestamp = TimerInit()
	$data_zack = _GetZackZack();
	_DoMessage();
EndIf
; Endlosschleife - Programm läuft
While 1
	; Interaktion mit GUI
	$nMsg = GUIGetMsg()
	Switch $nMsg
		; X gedrückt
		Case $GUI_EVENT_CLOSE
			; Möglichkeit: Beenden, Verstecken, Abbrechen
			$end = MsgBox(291, "HotPrice - Programm beenden", "Wollen Sie HotPrice vollständig beenden? Bei Nein wird das Programm in den SystemTray minimiert.")
			if $end == 6 Then
				exit;
			ElseIf $end == 2 Then
				$timestamp = TimerInit()
			Else
				GUISetState(@SW_HIDE)
				$GUIActive = 0;
				$timestamp = TimerInit()
				$data_zack = _GetZackZack();
				_DoMessage();				
			EndIf
		Case $Button1
			; Speichere Einstellungen in Ini
			; == Nicht implementiert, da ZackZack einzige bisher unterstützte Quelle
			;if GUICtrlRead($Checkbox1) == $GUI_CHECKED Then
			;	IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
			;	$UseZack = 1
			;Else
			;	IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "0")
			;	$UseZack = 0
			;EndIf
			; == MARKIERUNG
			$UseZack = 1
			GUICtrlSetState($Checkbox1, $GUI_CHECKED)
			if GUICtrlRead($Checkbox2) == $GUI_CHECKED Then
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
				$NoticeUpdate = 1
			Else
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "0")
				$NoticeUpdate = 0
			EndIf
			if GUICtrlRead($Checkbox3) == $GUI_CHECKED Then
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
				$UseTrayTip = 1
			Else
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "0")
				$UseTrayTip = 0
			EndIf
			if GUICtrlRead($Checkbox4) == $GUI_CHECKED Then
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "1")
				$UseSound = 1
			Else
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
				$UseSound = 0
			EndIf
			if GUICtrlRead($Checkbox5) == $GUI_CHECKED Then
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "1")
				$MessageBox = 1
			Else
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
				$MessageBox = 0
			EndIf
			if GUICtrlRead($Checkbox6) == $GUI_CHECKED Then
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "1")
				$Selective = 1
			Else
				IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
				$Selective = 0
			EndIf
			$interval = GUICtrlRead($Input1)
			IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", $interval)
			; Selektive Benachrichtigung: Lösche zuerst letzte Einträge in Ini
			IniDelete(@ScriptDir & "\config.ini", "Selective")
			; Trenne Eingabe in einzelne Suchanfragen
			$SelectivePArray = _StringExplode(GUICtrlRead($Edit1), @CRLF)
			; Schreibe Zeilen in INI
			For $i = 0 to UBound($SelectivePArray) - 1
				IniWrite(@ScriptDir & "\config.ini", "Selective", "Line"&$i+1, $SelectivePArray[$i])
			Next
			MsgBox(64, "HotPrice - Information", "Einstellungen wurden gespeichert")
		Case $Button2
			MsgBox(64, "HotPrice - Programm minimieren", "HotPrice wird nun in den SystemTray minimiert.")
			; Bei Betätigung des Verstecken-Buttons wird das Programm in den Systemtray minimiert
			GUISetState(@SW_HIDE)
			$GUIActive = 0;
			; Neue Daten werden abgerufen
			$timestamp = TimerInit()
			$data_zack = _GetZackZack()
			_DoMessage()
	EndSwitch
	; Interaktion durch TrayIcon
	$msg = TrayGetMsg()
	Switch $msg
		; Konfiguration
		case $conf
			; Konfiguration: Zeige Fenster an
			GUISetState(@SW_SHOW)
			$GUIActive = 1
		; Beenden
		case $ends
			; Beende Programm
			$end = MsgBox(324, "HotPrice - Programm beenden", "Wollen Sie HotPrice wirklich vollständig beenden?")
			if $end == 6 Then
				exit;
			EndIf
		; Aktualisieren 
		case $refr
			; Rufe Daten von ZackZack ab.
			$data_zack = _GetZackZack()
			$timestamp = TimerInit()
			_DoMessage()
		; Nochmal anzeigen
		case $show
			; Letzte Meldung ausgeben
			_DoMessage()
	EndSwitch
	; Nach 10 Minuten erneuter Abruf
	if TimerDiff($timestamp) > ($interval*60000) AND $GUIActive = 0 Then
		$timestamp = TimerInit()
		_DoMessage()
	EndIf	
WEnd
; UDF: DoZackMessage gibt Informationen von ZackZack aus
Func _DoMessage()
	; Übersichtlichkeit: Array der Abruffunktion aufteilen
	$name = $data_zack[0]
	$prs  = $data_zack[2]
	$proz = $data_zack[3]
	; Generiere Text für Benachrichtigung
	Dim $astrng[UBound($name)]
	For $i = 0 to UBound($name)-1
		$astrng[$i] = $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")"
	Next
	; Füge generiertes Array zusammen
	$string = _ArrayToString($astrng, @CRLF)
	; Benachrichtige bei normalem Preisabruf?
	if $NoticeUpdate = 1 Then
		; Verwende TrayTip (Fenster am Tray) ?
		if $UseTrayTip = 1 Then
			TrayTip("Preisinformationen", $string, 15)
		EndIf
		; Verwende Informationsfenster (Nervig) ?
		if $MessageBox = 1 Then
			MsgBox(0,"HotPrice - Preisinformationen", $string)
		EndIf	
	EndIf
	TraySetToolTip("HotPrice - Aktuelle Daten abgerufen");
	; Selektive Benachrichtigung beginnt hier
	; Prüfe, ob aktiviert
	If $Selective = 1 Then
		; Wieder Array der Länge 1, 0 geht ja nicht....
		Dim $selectiveresult[1]
		; Suche alle angegebenen Produkte nach Übereinstimmungen ab (Durchsucht nur Name)
		For $i = 0 to UBound($name) - 1
			For $y = 0 to UBound($SelectivePArray) - 1
				if StringInStr(StringUpper($name[$i]), StringUpper($SelectivePArray[$y])) Then
					_ArrayAdd($selectiveresult, $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")")
				EndIf
			Next
		Next
		; Gibt es welche, also Länge vom Array größer 1
		if UBound($selectiveresult) > 1 Then
			; Entferne Pseudoeintrag
			_ArrayDelete($selectiveresult, '')
			; Meldung generieren
			$string = _ArrayToString($selectiveresult, @CRLF)
			; Ausgabe
			TraySetToolTip("HotPrice - Suche erfolgreich!");
			; Verwende TrayTip (Fenster am Tray) ?
			if $UseTrayTip = 1 Then
				TrayTip("Suche erfolgreich!", $string, 20)
			EndIf
			; Verwende Informationsfenster (Nervig) ?
			if $MessageBox = 1 Then
				MsgBox(0,"HotPrice - Suche erfolgreich!", $string)
			EndIf
		EndIf
	EndIf
EndFunc
; UDF: GetZackZack holt Daten von ZackZack-Homepage
Func _GetZackZack()
	TraySetToolTip("HotPrice - Rufe neue Daten ab");
	; ZackZack-Seite aufrufen und Quelltext ausgeben
	$source = _INetGetSource ("http://www.zack-zack.com/html/index.html")
	; Suche nach Begrenzer für Produkte und trenne alles davor und dannach ab
	$temp = _StringExplode($source, '<div class="highlightsArea">')
	$source = $temp[1]
	$temp = _StringExplode($source, '<div id="footer">')
	$source = $temp[0]
	; Zeilenumbrüche entfernen, übernommen aus vorherigem PHP-Script
	$source = StringReplace($source, '\r', "");
	$source = StringReplace($source, '\n', "");
	; Produkt-ID herausbekommen
	$id = _StringBetween($source, '<span id="percent_', '">')
	; Anzahl der Produkte herausfinden
	$anzahl = UBound($id);
	; Verfügbarkeit der angegebenen Produkte herausfinden
	Dim $prozent[$anzahl] 
	For $i = 0 to $anzahl - 1
		$percent = _StringBetween($source, '<span id="percent_' & $id[$i] & '">', '</span>')
		$prozent[$i] = $percent[0] & "%";
	Next
	; Artikeldaten rausbekommen
	$cat = _StringBetween($source, '<div class="category">', '</div>')
	$name = _StringBetween($source, '<div class="articleName">', '</div>')
	$prs = _StringBetween($source, '<span style="font-size:18px;">nur &euro; ', '*</span>')
	; Leerzeichen korrigieren
	For $i = 0 to $anzahl - 1
		$name[$i] = Stringreplace($name[$i], "&nbsp;", " ")
	Next
	; Datenarray, welches zurückgegeben wird
	Dim $data_zack[5]
	$data_zack[0] = $name;
	$data_zack[1] = $cat;
	$data_zack[2] = $prs;
	$data_zack[3] = $prozent;
	$data_zack[4] = $id;
	Return $data_zack;
EndFunc
