#!/bin/bash
################################################################################
# Ten program jest wolnym oprogramowaniem. Można go rozprowadzać i modyfikować #
# zgodnie z licencją GNU General Public License opublikowaną przez             #
# Free Software Foundation w wersji 2 z późniejszymi zmianami.                 #
#                                                                              #
#                                       Paweł Salawa (Googie) boogie@arkada.pl #
################################################################################

# Na wstepie, bash sprawdzi czy mamy pakiet TK:
#\
if [ -z `which wish` ]; then
#\
echo
#\
echo "-----"
#\
echo "Nie mozna odnalezc programu wish w zmiennej PATH."
#\
echo "Prawdopodobnie TK (badz tez caly TCL) nie jest zainstalowany."
#\
echo "Z regoly obydwa pakiety znajduja sie na plycie instalacyjnej"
#\
echo "kazdego systemu unixowego, wiec latwo mozna je doinstalowac."
#\
exit 1
#\
fi
# Jesli jest, to uruchamiamy go:
#\
exec wish "$0" "$@"

### TCL/TK ###
set scriptversion 1.0.5
global IIK
set IIK 1

#######################################
### Sprawdzanie kompatybilnosci TCL/TK:
if {$tk_version < 8.3} {
    toplevel .err
    set winheight 80
    set winwidth 300
    set geomx [expr [expr [winfo screenwidth .] - $winwidth] / 2]
    set geomy [expr [expr [winfo screenheight .] - $winheight] / 2]
    wm maxsize .err $winwidth $winheight
    wm minsize .err $winwidth $winheight
    wm geometry .err +$geomx+$geomy
    wm title .err "Uwaga!"
    label .err.txt -text "Wersja TCL/TK: $tk_patchLevel\nWymagana >= 8.3\nMozliwe jest niestabilne zachowanie instalatora." -font "Helvetica -12 bold"
    button .err.bt -text "OK" -bd 1 -command {destroy .err; set ok 1}
    pack .err.txt .err.bt -side top
    vwait ok
}
catch {package require http 2.4} http
if {[llength $http] > 1} {
    toplevel .err
    set winheight 90
    set winwidth 320
    set geomx [expr [expr [winfo screenwidth .] - $winwidth] / 2]
    set geomy [expr [expr [winfo screenheight .] - $winheight] / 2]
    wm maxsize .err $winwidth $winheight
    wm minsize .err $winwidth $winheight
    wm geometry .err +$geomx+$geomy
    wm title .err "Uwaga!"
    label .err.txt -text "Ten skrypt wymaga rozszerzenia http dla TCL'a,\nktorego Ty nie masz zainstalowanego,\nlub masz za stara jego wersje. Wymagana to 2.4.\nMusisz sciagnac i zainstalowac zrodla recznie." -font "Helvetica -12 bold"
    button .err.bt -text "OK" -bd 1 -command {destroy .err; set ok 1}
    pack .err.txt .err.bt -side top
    vwait ok
    exit 1
}

#################
### Inicjalizacja
set winheight 260
set winwidth 400
set geomx [expr [expr [winfo screenwidth .] - $winwidth] / 2]
set geomy [expr [expr [winfo screenheight .] - $winheight] / 2]
wm maxsize . $winwidth $winheight
wm minsize . $winwidth $winheight
wm geometry . +$geomx+$geomy
wm title . "Instalator Kadu v$scriptversion"

#############
### Slonko :)
image create photo kadu -format gif -data {
R0lGODlhZABJAOcAAAICAubaBrqyBoJ+Bu4mCmpmAlJOAlYSBkJCBjIyAiYm
AhoaAuYmCpaOBureBhYWAsK6Bg4OAu7iBvLmBl5eXgYGAvaqBs7CBpqSBkIK
AlZWVmJCBvbqBqKaBnJuBkJCQjY2NtbOBk4aBqaeBk5OTnYSBq6KBl5aAvru
BnZyBrKqBt62BgoKAvYqCjo2AoaCBi4uLjIyMtrSBmoSBuo+CkpKAh4eAlpW
An56Bv7yBi4uBqqiBj4+Bv42Cl4SBhoOCvoqCt7WBnpyBs7GBhoaGhYWFhIG
BgoKBhISAo6KBrquBi4qAmZiBlZSAiIiAnJqBu4uCkZGAoIWBtLGBsK2Bm5q
Ajo6Anp2BmJaAoqGBgYGBsq+Bq6mBtbKBrauBg4ODmYSBtrOBiYiAuLWBv7u
BhYWBt7SBoJ6Br62BioqBn52Ao6GBsa+BhYSAmZeAhIOAhISBr6yBm5mAjIu
AgoKClZSBoJ6DkZCAh4aAhoWAvLiBnZuAk5KAv4qCpKKBj46ArKmBkZGRjo6
Om4WBl5WBoZ+BjYyBiomAiIeAkI+AkpGAm5qCkI+CloSBmISBkZCBk5KBlpW
BubaCiYmBjo2Bn52BnZuBq6mCtbKClZSClJOBrKqCiIiBhISCg4OBhYWCiYi
BiIeBmpmBl5aBmJaBo6GCkI+BkpGBhoaBnpyCm5qBjo6BrauChIOBm5mBjIu
Bh4aBj46Bv//////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
/////////////////////yH5BAEKAP8ALAAAAABkAEkAAAj+AP8JHEiwoMGD
CBMqXMiwocOHECNKnEixosWLGDNOBABAo8ePEul0BEmy5EGOIzNqMcmyoBYA
KzFybEnz38uZF1/SqdkS5UWYAHbyZAm0IsqYQ00WpYgyZVKSHJFGhPnyaUKq
FnFKPGoV4U2fW50+bNpVIVCtNcmWvRoVrVK1a71q0SJSakm4cdmC9Xp2btOm
dgW+9JuXIdCqLr/6jeChceMUsfwiJri08EKqKQdzXIJAVYgwYczkGE1aQhgI
jxIhQXtTpluQHCn8jdBkxBjSuHPnptKERcrXU/ey/ArARYopupMrz9GFE/CI
msXejdpmh4Pl2HVLelFB+tijgWH+z60QagcE3Hog1KkTRE925ZUqCIV4GC/J
r0lym8Hxl8X597qVAtN3fz2XUVMumIHCaBIAAgosQL3yyCmPtKLJdQCShsIa
R3hX0F9zfaXUSyxgcNtoDmhSwUtvkMJFAKNxUAcAm2SYmw3hgQfigERxxIIA
uHXQlChd6HYGjTbiNgWOH4oU1U2DzVfSTbFwQZoZlHQCQBl1mOGHCmHkdoYW
KuhmxiuGKLGgcgW4FV1faWnRBAejoVDIEhw9YGUONhhyiGikhQGKErpdARSg
yYXh1o4GegRABZ7gZsl4J+DGyVyQAGgoR5EsJ8Eq0jUlZU9aVNDBaGQ8cRMT
E+CGyEv+mb5XSVSaYLfHZHHNRNoYUWFBJ26hcHSKpijFgV0XvhWG02hm6MBR
pbo5B0Cs2cXRIQASZIdEeGvlYAaeACzya26hCEICtdnBwVG2y2HCArdlkYHD
S50gqock7GYBAwCsZFgGRxgql0KjVknC0RHGkhYJAIdg4m0qAEiSoboABJzc
wPB2RbEpuWUCkw0OT4DBmu8JeUiry03qYVkcvSIxbm4AdUWSo0kygh/YSSIG
rnmhlF9uHDzCUSzs0pydGYNZJhhHiOJ2iSccPfIygGFwUkp2mhD81EuaoKwb
Fae8ZEgDZGQ3gSXOGYIdFf+u3FJdPP4DExPYBQ3UIg4nN0H+JR6/ROhyNXA0
aloFdlRUdhxAEhQAX5ByySU7XGLCBp9oiRIkJOsGcdw81QeY3Lpm5wAjZ7V1
FEeoLHLBche0IRxNgxHnk08AZt1XWy89UkiYy23R9kqEtfQmz3KvBGAhg5VA
gBSNHOAIAQRAYUF2otBBmJOcgzRYEdlT1hGADrTC0SBA9GH++TSssNwEhPj1
m4hQRaXBQiJlkqEdQDFwvvk9iBCxckITDma0NhU6YO8yMMlbdi7hpAOcrwU+
+IEWluC1mvmhE+4zCFVaoxGUyCZjA+EIJdzzHkNwJAMt6EMLZsCRTzRtO6/4
C0Jw57aHRAcic5kEgFiBEh/0wRHeKPEAbioBCh2ZBTwyySB9glKJEymHDPh7
iRFQ8gg0dIAIRfgCDRsCmBpepipePAlHQrGIKVQQNxxwxSe+UoROWK5A9IFS
GGc4R73QixKQiEQhBFKIStiBEKSLCgi0GCLiEQiEZkEkFxlVyJsE4gONJCBD
OLgVRdrwL9g7zL7qqDQccrKT8ZMkKO/zOeh8cpQEcZ8hDTMXVG5kgBNJmiuX
GLxXWnKWAjlLVl6HSzp2Lzi/7OWHVglMYSLwlGK8pSuDGRZRonJwuwyKMWf4
kUIic5rAJCY2O1jLbXpzIQEBADs=
}

################################
### Lokalizacja przegladarki www
foreach browser {konqueror galeon mozilla netscape} {
    catch {exec which $browser} res
    if {[llength $res] == 1} {
        set webbrowser $res
        break
    }
}
if {![info exists webbrowser]} {
    foreach browser {links lynx} {
        catch {exec which $browser} res
        if {[llength $res] == 1} {
            set webbrowser "[exec which xterm] -fg grey -bg black -e $res"
            break
        }
    }
}

###############
### Kolorystyka
set themeopts "-background grey87 -activebackground white -foreground black -activeforeground black"

#############################
### Konfiguracja klienta http
namespace import ::http::*
config -useragent "TCL installer $scriptversion"

###########
### Zmienne
set cwin 1
set maxwins 1
set var(file) ""
set var(stable) 1
set kaduside http://kadu.net
set download download.php
set stable releases
set unstable ""
set downloadto "$env(HOME)"
set var(useproxy) 0

#########
### Dymki
proc tips {w msg} {
    bind $w <Enter> "after 1000 \"tips_aux %W [list $msg]\""
    bind $w <Leave> "after cancel \"tips_aux %W [list $msg]\"
                     after 100 {catch {destroy .tips_help}}"
}

proc tips_aux {w msg} {
    set t .tips_help
    catch {destroy $t}
    toplevel $t
    wm overrideredirect $t 1
    if {$::tcl_platform(platform) == "macintosh"} {
     unsupported1 style $t floating sideTitlebar
    }
    pack [label $t.l -text $msg -relief raised -bd 1 -bg lightyellow] -fill both
    set x [expr [winfo rootx $w]+6+[winfo width $w]/2]
    set y [expr [winfo rooty $w]+6+[winfo height $w]/2]
    wm geometry $t +$x\+$y
    bind $t <Enter> {after cancel {catch {destroy .tips_help}}}
    bind $t <Leave> "catch {destroy .tips_help}"
}

###############
### Glowne okno

frame .l -relief raised -borderwidth 1
frame .r
frame .r.u
frame .r.d
frame .l.c
eval button .l.c.img -image kadu -bd 0 -command {"catch {exec $webbrowser http://kadu.net &}"} $themeopts
tips .l.c.img "Kliknij aby otworzyc strone Kadu."
label .l.c.txt -text "Internetowy\ninstalator Kadu\nv$scriptversion"

pack .r -side right -fill both -expand yes
pack .l -side left -fill y
pack .l.c -side left
pack .l.c.img -side bottom
pack .l.c.txt -side top
pack .r.u -side top -fill both -expand yes
pack .r.d -side bottom -fill x

label .r.d.status -padx 0.5c
tips .r.d.status "Liczba bierzacego kroku,\nw stosunku do wszystkich krokow."
eval button .r.d.close -text "Zaniechaj" -borderwidth 1 -command exit $themeopts
eval button .r.d.next -text {"Dalej >>"} -borderwidth 1 -command next $themeopts
eval button .r.d.prev -text {"<< Wstecz"} -borderwidth 1 -command prev -state disabled $themeopts

pack .r.d.next .r.d.prev .r.d.status -side right
pack .r.d.close -side left

bind . <Escape> exit



### Okno 1 (Powitanie)
set w .r.u.$maxwins
frame $w
set pad($w) 0.4
label $w.txt -text "Witaj w instalatorze Kadu. Skrypt ten sciagnie,
skompiluje i zainstaluje najnowsza wersje Kadu
na Twoim komputerze."
pack $w.txt -side top



### Okno 2 (Proxy)
incr maxwins
set w .r.u.$maxwins
frame $w
set pad($w) 0.18
set pad(x_$w) 0.12
set ww $w.check
frame $ww
checkbutton $ww.c -variable var(useproxy) -selectcolor blue -text "Uzyj serwera proxy" -command {IsProxy $var(useproxy)}
pack $ww.c
eval $ww.c configure $themeopts

set ww $w.host
frame $ww
label $ww.l -text "Adres serwera proxy:" -state disabled
frame $ww.o
entry $ww.o.e -width 30 -textvariable var(proxyhost) -state disabled

pack $ww.o.e -side right
pack $ww.l $ww.o -side top

set ww $w.port
frame $ww
label $ww.l -text "Port serwera proxy:" -state disabled
frame $ww.o
entry $ww.o.e -width 6 -textvariable var(proxyport) -state disabled

pack $ww.o.e -side right
pack $ww.l $ww.o -side top
pack $w.check -side top
pack $w.host $w.port -side top -pady 0.2c

proc IsProxy {sw} {
    foreach path {.r.u.2.host .r.u.2.port} {
        if {$sw} {
            $path.l configure -state normal
            $path.o.e configure -state normal
            focus -force .r.u.2.host.o.e
        } else {
            $path.l configure -state disabled
            $path.o.e configure -state disabled
        }
    }
}


### Okno 3 (Wybor wersji stabilnej, lub snapshota)
incr maxwins
set w .r.u.$maxwins
frame $w
set pad($w) 0.3
set pad(x_$w) 0.1
frame $w.1
frame $w.2
radiobutton $w.1.r -text "Sciagnij stabilna wersje (Zalecane)" -variable var(stable) -value 1 -pady 0.2c
radiobutton $w.2.r -text "Sciagnij dzisiejszy snapshot" -variable var(stable) -value 0 -pady 0.2c
tips $w.1.r "Stabilna wersja to takze PRE oraz RC."
tips $w.2.r "Spashoty moga niestabilnie pracowac."
eval $w.1.r configure $themeopts -selectcolor blue -bd 1
eval $w.2.r configure $themeopts -selectcolor blue -bd 1
label $w.txt -text  "Kliknij 'dalej' aby sprawdzic
najnowsza dostepna wersje Kadu."
pack $w.1 $w.2 -side top -fill x
pack $w.1.r $w.2.r -side left
pack $w.txt -side top



### Okno 4 (Sprawdzanie dostepnej wersji)
incr maxwins
set w .r.u.$maxwins
frame $w
set pad($w) 0.3
set pad(x_$w) 0.15
label $w.txt
pack $w.txt -side top



### Okno 5 (Pobieranie)
incr maxwins
set w .r.u.$maxwins
frame $w
set pad($w) 0.5
set pad(x_$w) 0.15
frame $w.f -relief groove -bd 3
canvas $w.f.c -width 100 -height 20 -bd 0 -highlightthickness 0 -background black
$w.f.c create rectangle 0 0 0 50 -fill blue -tags bar
$w.f.c create text 50 10 -text "0%" -font "helvetica 10 bold" -fill white -tags txt
$w.f.c lower bar txt
tips $w.f.c "Postep sciagania pakietu."
label $w.txt
pack $w.f.c
pack $w.f $w.txt -side top



### Okno 6 (Rozpakowywanie)
incr maxwins
set w .r.u.$maxwins
frame $w
set pad($w) 0.3
set pad(x_$w) 0.2
label $w.txt
pack $w.txt -side top



##########################
### Procedury instalacyjne
proc progress {token total current} {
    set percent [expr [expr $current * 100] / $total]
    .r.u.5.f.c itemconfigure txt -text "$percent\%"
    .r.u.5.f.c coords bar 0 0 $percent 50
}
proc httpData {token} {
    upvar #0 $token state var var
    if {$var(stable)} {
        set fd [open /tmp/kadu-download w+]
        puts $fd $state(body)
        close $fd
        set fd [open /tmp/kadu-download r]
        while {![eof $fd]} {
            gets $fd line
            if {[string match {*kadu-*.tar.gz*} $line]} {
                set idx1 [string first {tar.gz">kadu-} $line]
                #"
                set idx2 [string first {</A>} $line]
                lappend data "[string range $line [expr $idx1 + 8] [expr $idx2 - 1]] [lrange $line end-2 end]"
            }
        }
        close $fd
        set Version 0
        set which ""
        foreach kadu "$data" {
            set cver [string map {. "" -pre .1 -rc .2} [string range [lindex $kadu 0] 5 end-7]]
            if {$cver > $Version} {
                set Version $cver
                set version [string range [lindex $kadu 0] 5 end-7]
                set which "$kadu"
            }
        }
        set size "[lindex $which end]"
        set date "[lrange $which 1 2]"
        set var(file) "kadu-$version.tar.gz"
        if {[file exists $var(file)]} {
            .r.u.4.txt configure -text "Najnowsza wersja Kadu: $version\nz dnia $date\n(wielkosc: $size)\nPlik o takiej nazwie istnieje.\nIstniejacy plik dostanie nowa nazwe:\n$var(file).bak,\na jego miejsce zajmie nowy.\nKliknij 'Dalej' aby kontynuowac."
            file rename -force $var(file) $var(file).bak
        } else {
            .r.u.4.txt configure -text "Najnowsza wersja Kadu: $version\nz dnia $date\n(wielkosc: $size)\nKliknij 'Dalej' aby sciagnac plik."
        }
    } else {
        set fd [open /tmp/kadu-download w+]
        puts $fd $state(body)
        close $fd
        set fd [open /tmp/kadu-download r]
        while {![eof $fd]} {
            gets $fd line
            if {[string match {*kadu-????????.tar.gz*} $line]} {
                set which [string range $line end-19 end]
                break
            }
        }
        close $fd
        set date [string range $which 5 12]
        set var(file) "$which"
        set readableDate "[string range $date 6 7].[string range $date 4 5].[string range $date 0 3]"
        if {[file exists $var(file)]} {
            .r.u.4.txt configure -text "Najnowszy snapshot jest z dnia:\n$readableDate\nIstniejacy plik dostanie nowa nazwe:\n$var(file).bak,\na jego miejsce zajmie wlasciwy.\nKliknij 'Dalej' aby kontynuowac."
            file rename -force $var(file) $var(file).bak
        } else {
            .r.u.4.txt configure -text "Najnowszy snapshot jest z dnia:\n$readableDate\nKliknij 'Dalej' aby sciagnac plik."
        }
    }
    .r.d.next configure -state normal
    .r.d.prev configure -state normal
    update
}
proc next {} {
    global cwin var pad
    upvar #0 maxwins mw
    place forget .r.u.$cwin
    incr cwin
    if {$cwin > $mw} {
        destroy .r .l
        cd kadu
        uplevel {
            source Instaluj.tcl
        }
    } else {
        if {[info exists pad(.r.u.$cwin)]} {
            if {[info exists pad(x_.r.u.$cwin)]} {
                eval place .r.u.$cwin -rely $pad(.r.u.$cwin) -relx $pad(x_.r.u.$cwin)
            } else {
                eval place .r.u.$cwin -rely $pad(.r.u.$cwin)
            }
        } else {
            place .r.u.$cwin -rely 0 -relx 0
        }
        update
        switch -- $cwin {
            4 {
                .r.u.4.txt configure -text "Czekaj. Instalator sprawdza\nnajnowsza wersje Kadu..."
                .r.d.next configure -state disabled
                .r.d.prev configure -state disabled
                global kaduside download stable
                if {$var(useproxy)} {
                    config -proxyhost $var(proxyhost) -proxyport $var(proxyport)
                }
                if {$var(stable)} {
                    geturl [join "$kaduside $stable" /]/ -command httpData
                } else {
                    geturl [join "$kaduside $download" /] -command httpData
                }
            }
            5 {
                .r.u.5.txt configure -text "Sciaganie $var(file)..."
                .r.d.next configure -state disabled
                .r.d.prev configure -state disabled
                set fd [open $var(file) w]
                fconfigure $fd -translation binary
                if {$var(stable)} {
                    upvar #0 kaduside ks stable st
                    geturl [join "$ks $st $var(file)" /] -channel $fd -binary 1 -progress progress
                } else {
                    upvar #0 kaduside ks unstable unst
                    geturl [join "$ks $unst $var(file)" /] -channel $fd -binary 1 -progress progress
                }
                close $fd
                .r.u.5.txt configure -text "Klinkij 'Dalej' aby kontynuowac."
                .r.d.next configure -state normal
                .r.d.prev configure -state normal
            }
            6 {
                .r.u.$mw.txt configure -text "Rozpakowywanie, prosze czekac..."
                update
                if {[file exists $var(file)]} {
                    if {[catch "exec gzip -d $var(file)" err]} {
                        tk_messageBox -icon error -message "Podczas rozpakowywania wystapil blad:\n$err\nSprobuj naprawidz blad, nastepnie kliknij 'Wstecz' i ponownie 'Dalej'." -parent . -type ok -title "Blad!"
                        .r.d.next configure -state disabled
                    }
                }
                if {[file exists [string range $var(file) 0 end-3]]} {
                    if {[catch "exec tar xf [string range $var(file) 0 end-3]" err]} {
                        tk_messageBox -icon error -message "Podczas rozpakowywania wystapil blad:\n$err\nSprobuj naprawidz blad, nastepnie kliknij 'Wstecz' i ponownie 'Dalej'." -parent . -type ok -title "Blad!"
                        .r.d.next configure -state disabled
                    }
                } else {
                    tk_messageBox -icon error -message "Podczas rozpakowywania wystapil blad:\nNie znaleziono pliku!\nZostal on usuniety lub przeniesiony.\nSprobuj naprawidz blad, nastepnie kliknij 'Wstecz' i ponownie 'Dalej'." -parent . -type ok -title "Blad!"
                    .r.d.next configure -state disabled
                }
                .r.u.$mw.txt configure -text "Pakiet zostal rozpakowany.\nKliknij 'Dalej' aby przejsc do kompilacji."
            }
        }
        if {$cwin > 1} {
            .r.d.prev configure -state normal
        }
        .r.d.status configure -text "\[$cwin/$mw\]"
    }
}
proc prev {} {
    upvar #0 cwin cwin var var maxwins mw pad pad
    place forget .r.u.$cwin
    incr cwin -1
    if {[info exists pad(.r.u.$cwin)]} {
            if {[info exists pad(x_.r.u.$cwin)]} {
                eval place .r.u.$cwin -rely $pad(.r.u.$cwin) -relx $pad(x_.r.u.$cwin)
            } else {
                eval place .r.u.$cwin -rely $pad(.r.u.$cwin)
            }
    } else {
        place .r.u.$cwin -rely 0 -relx 0
    }
    if {$cwin < $mw} {
        .r.d.next configure -text "Dalej >>" -command next
    }
    if {$cwin == 1} {
        .r.d.prev configure -state disabled
    }
    .r.d.status configure -text "\[$cwin/$mw\]"
}
eval place .r.u.1 -rely $pad(.r.u.1)
cd $downloadto
.r.d.status configure -text "\[$cwin/$maxwins\]"


### KDE 3.x tego potrzebuje do sprawnego dzialania :)
pack propagate . false
