#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=AutoItNews
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstants.au3>
#Include <GuiListView.au3>
#include <IE.au3> 
#include <file.au3>
Opt("GUIOnEventMode", 1)
AutoitSetOption("WinTitleMatchMode", 2)

Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
Global $ListView1

Dim $oIE = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
Dim $oIEshowLast = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
Dim $oTable, $oLinks, $IEtitle = 'AutoIt Forum - Deutsch'
Dim $aTableData, $aOldData[1][1], $time = @HOUR & ':' & @MIN, $timeRefresh, $news = 1
Dim $aLinks[10], $arItem[20], $arTmp[20][7], $titel = "Letzte Forenbeiträge       "
Dim $WhiteSmoke = 0xF5F5F5, $LightGray = 0xD3D3D3, $Coral = 0xFF7F50

HotKeySet("!e", "_Ende")
HotKeySet("!s", "_ShowGUI")
HotKeySet("!c", "_CloseIE")

$Form1 = GUICreate($titel & $time, 727, 367, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$ListView1 = GUICtrlCreateListView("Beitrag|Autor|Antworten/ Hits|Letzter", 16, 40, 694, 314)
_GUICtrlListViewSetColumnWidth(-1,0,350) 
_GUICtrlListViewSetColumnWidth(-1,1,130)
_GUICtrlListViewSetColumnWidth(-1,2,90)
_GUICtrlListViewSetColumnWidth(-1,3,117)
$cbIfNews = GUICtrlCreateCheckbox("Nur zeigen bei News", 16, 13, 130, 17)
GUICtrlSetOnEvent(-1, "_IfNews")
$cbOnlyNews = GUICtrlCreateCheckbox("Zeige nur News", 150, 13, 100, 17)
GUICtrlSetOnEvent(-1, "_OnlyNews")
GUICtrlCreateLabel("Aktualisierungs-Intervall in Sekunden:", 475, 13, 180, 17)
$inTime = GUICtrlCreateInput(60, 660, 10, 50, 20, BitOR($ES_RIGHT, $ES_MULTILINE))

GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

_show()
$start = TimerInit()
$begin = TimerInit()
While 1
	If TimerDiff($begin) > $timeRefresh Then
		_IEAction($oIE, "refresh")
		_show()
		$begin = TimerInit()
	EndIf
	If TimerDiff($start) > 60000 Then
		$time = @HOUR & ':' & @MIN
		WinSetTitle($Form1, "", $titel & $time)
		$start = TimerInit()
	EndIf
WEnd

Func _Ende()
	Exit
EndFunc
		
Func AForm1Close()
	GUISetState(@SW_HIDE, $Form1)
EndFunc

Func _ShowGUI()
	GUISetState(@SW_SHOW, $Form1)
EndFunc

Func _IfNews()
	If (GUICtrlRead($cbOnlyNews) = 1) And (GUICtrlRead($cbIfNews) = 4) Then _
	GUICtrlSetState($cbOnlyNews, $GUI_UNCHECKED)
EndFunc

Func _OnlyNews()
	GUICtrlSetState($cbIfNews, $GUI_CHECKED)
EndFunc

Func _show()
	If _readData() = -1 Then
		_GUICtrlListViewDeleteAllItems($ListView1)
		_setData()
		$timeRefresh = GUICtrlRead($inTime)*1000
		If GUICtrlRead($cbIfNews) = 1 Then
			If $news > 0 Then GUISetState(@SW_SHOW, $Form1)
		Else
			GUISetState(@SW_SHOW, $Form1)
		EndIf
	EndIf
EndFunc

Func _readData()
	$news = 0
	$oLinks = _IELinkGetCollection ($oIE)
	_getLinks()
	$oTable = _IETableGetCollection ($oIE,17)
	$aTableData = _IETableWriteToArray ($oTable)
	If @error Then Return 0
	If UBound($aOldData) > 1 Then
		For $i = 1 To 10
			For $k = 1 To 10
				If $aOldData[2][$k] = $aTableData[2][$i] Then
					If $aOldData[6][$k] <> $aTableData[6][$i] Then
						$aTableData[0][$i] = 1 ; geänderter Eintrag
						$news += 1
						ExitLoop
					Else
						$aTableData[0][$i] = 2 ; unverändert
					EndIf
				EndIf
			Next
		Next
		For $i = 1 To 10
			If ($aTableData[0][$i] <> 1) Then 
				If ($aTableData[0][$i] <> 2) Then 
					$aTableData[0][$i] = 1 ; neuer Eintrag
					$news += 1
				EndIf
			EndIf
		Next
	EndIf
	$aOldData = $aTableData
	For $i = 1 To 10
		$aOldData[0][$i] = 0
	Next
	_Array2DMirror($aTableData)
	ReDim $arTmp[UBound($aTableData)-2][UBound($aTableData,2)]
	For $i = 1 To UBound($aTableData) -2
		For $k = 0 To UBound($aTableData,2)-1
			$arTmp[$i-1][$k] = $aTableData[$i][$k]
		Next
	Next
	$aTableData = $arTmp
	ReDim $arTmp[20][7]
	For $x = 1 To 6
		$k = 1
		If ($x = 2) Or ($x = 4) Or ($x = 6) Then
			For $i = 0 To 9
				$var = StringSplit($aTableData[$i][$x], @CRLF)
				$arTmp[$k-1][$x] = $var[1]
				$arTmp[$k][$x] = $var[3]
				$k += 2
			Next
		Else
			For $i = 0 To 9
				$arTmp[$k-1][$x] = $aTableData[$i][$x]
				$k += 2
			Next
		EndIf
	Next
	For $i = 0 To 18 Step 2
		$arTmp[$i+1][0] = $arTmp[$i][0]
	Next
	For $i = 0 To 9
		$k = 2*$i
		$arTmp[$k][1] = $aLinks[$i]
		$arTmp[$k+1][1] = $aLinks[$i]
		$arTmp[$k][0] = $aTableData[$i][0]
		$arTmp[$k+1][0] = $aTableData[$i][0]
	Next
	$aTableData = $arTmp
	Return -1
EndFunc

Func _getLinks()
	Local $i = 0, $k = 0
	ReDim $aLinks[10]
	For $oLink In $oLinks
		If StringInStr($oLink.href, '?goto=lastpost&threadid=',1) Then
			$aLinks[$i] = $k ; LinkIndex
			$i += 1
		EndIf
		$k += 1
	Next	
EndFunc

Func _setData()
	Local $k = 0, $n = 0
	Select
		Case GUICtrlRead($cbOnlyNews) = 4
			ReDim $arItem[20]
			ReDim $aLinks[20]
			For $i = 0 To 19
				$k += 1
				If Mod($i, 2) = 0 Then
					$arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&$aTableData[$i][3]& _
					' / '&$aTableData[$i][5]&'|'&$aTableData[$i][6], $ListView1)
				Else
					$arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&'|'&$aTableData[$i][6], $ListView1)
				EndIf																	
				If ($k = 1) Or ($k = 2) Then
					If ($aTableData[$i][0] = 1) And (Mod($k, 2) <> 0) Then
						GUICtrlSetBkColor($arItem[$i], $Coral)
					Else
						GUICtrlSetBkColor($arItem[$i], $WhiteSmoke)
					EndIf
				Else
					If $aTableData[$i][0] = 1 Then
						GUICtrlSetBkColor($arItem[$i], $Coral)
					Else
						GUICtrlSetBkColor($arItem[$i], $LightGray)
					EndIf
				EndIf
				If $k = 4 Then $k = 0
				$aLinks[$i] = $aTableData[$i][1]
			Next
		Case (GUICtrlRead($cbOnlyNews) = 1) And ($news > 0)
			ReDim $arItem[2*$news]
			ReDim $aLinks[2*$news]
			For $i = 0 To 19
				$k += 1
				If $aTableData[$i][0] = 1 Then
					If Mod($i, 2) = 0 Then
						$arItem[UBound($arItem)-1] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&$aTableData[$i][3]& _
						' / '&$aTableData[$i][5]&'|'&$aTableData[$i][6], $ListView1)
					Else
						$arItem[$i] = GUICtrlCreateListViewItem($aTableData[$i][2]&'|'&$aTableData[$i][4]&'|'&'|'&$aTableData[$i][6], $ListView1)
					EndIf
					If ($k = 1) Or ($k = 2) Then
						GUICtrlSetBkColor($arItem[$i], $WhiteSmoke)
					Else
						GUICtrlSetBkColor($arItem[$i], $LightGray)
					EndIf
					If $k = 4 Then $k = 0
					$aLinks[$n] = $aTableData[$i][1]
					$n += 1
				EndIf
			Next
	EndSelect
EndFunc

Func ListView_DoubleClick()
	$index = _GUICtrlListViewGetCurSel($ListView1)
	_IENavigate($oIEshowLast, "http://www.autoit.de/portal.php")
	If @error Then $oIEshowLast = _IECreate ( "http://www.autoit.de/portal.php",0,0,1,-1)
	_IELinkClickByIndex($oIEshowLast, $aLinks[$index])
	_IEAction($oIEshowLast, "visible")
	WinSetState($IEtitle, '', @SW_MAXIMIZE)
EndFunc

Func _CloseIE()
	_IEAction($oIEshowLast, "invisible")
EndFunc

Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    Case $wParam = $ListView1
        Select
            Case $event = $NM_DBLCLK
                ListView_DoubleClick ()
            EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
EndFunc  ;==>WM_Notify_Events

;----------------------------------------------------------------------------------------------------------------------
;	Function		_Array2DMirror(ByRef $ARRAY)
;
;	Description		to mirror columns with rows in an 2D Array
;
;	Parameter		$ARRAY:			2D Array
;
;	Return			Succes			-1		ByRef mirrored Array
;					Failure			0  		set @error
;									@error = 1 	given array is not array
;
;	Author			BugFix (bugfix@autoit.de)
;----------------------------------------------------------------------------------------------------------------------
Func _Array2DMirror(ByRef $ARRAY)
	If ( Not IsArray($ARRAY) ) Then
		SetError(1)
		Return 0
	EndIf
	Local $UBound2nd = UBound($ARRAY,2)
	If @error = 2 Then
		SetError(2)
		Return 0
	EndIf
	Local $arTMP[$UBound2nd][UBound($ARRAY)]
	For $i = 0 To UBound($ARRAY) -1
		For $k = 0 To UBound($ARRAY,2) -1
			$arTMP[$k][$i] = $ARRAY[$i][$k]
		Next
	Next
	$ARRAY = $arTMP
	Return -1
EndFunc ;==>_Array2DMirror