#!/usr/bin/X11/tixwish     

proc drawUsersTab { win } {
    global idByUser uName uFullName uGroups uMail uSMTP
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin


    frame $win.t 
    tixScrolledWindow $win.w   -width 1012  -height 600 -scrollbar y
    frame $win.b
    pack $win.t $win.w  $win.b -side top -fill x
    

    pack $win.t -side top -fill x
    label $win.t.e -text "    " -bd 1 -width 8 -font $pbfnt
    label $win.t.n -text " User" -width 12 -font $pbfnt
    label $win.t.f -text " Fullname" -width 28 -font $pbfnt
    label $win.t.g -text " Groups" -width 56 -font $pbfnt
    label $win.t.m -text " Mail" -width 17 -font $pbfnt
    label $win.t.s -text " SMTP" -width 15 -font $pbfnt
    pack $win.t.e  $win.t.n $win.t.f $win.t.g $win.t.m $win.t.s -side left   -padx 1

    set swin [ $win.w subwidget window]
    foreach uid [ lsort -integer  [ array names uName] ] {
	frame $swin.$uid -relief ridge -bd 2
	pack $swin.$uid -fill x -side top 
	addUserLine $swin $uid
	clearUserLine $swin $uid 
	fillUserLine $swin $uid
    }
    button $win.b.n -text " New " -command addUser  -width 5 -font $bfnt
    pack $win.b.n -side left
}
proc addUserLine {swin uid} {
    global idByUser uName uFullName uGroups uMail uSMTP
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin


    frame $swin.$uid.b -relief raised -bd 1
    frame $swin.$uid.n -relief raised -bd 1 -bg grey88
    frame $swin.$uid.f -relief raised -bd 1
    frame $swin.$uid.g -relief raised -bd 1 -bg grey88
    frame $swin.$uid.m -relief raised -bd 1
    pack  $swin.$uid.b $swin.$uid.n $swin.$uid.f $swin.$uid.g $swin.$uid.m  -side left -fill both 

    button $swin.$uid.b.e -text "Edit" -font $bfnt  -width 5 -command editUser
    bind $swin.$uid.b.e  <Button> {set curWin %W}

    label $swin.$uid.n.l -text ""  -width 12 -font $pbfnt  -bg grey88  -anchor nw
    pack $swin.$uid.b.e  $swin.$uid.n.l -side top -fill x 

    frame $swin.$uid.f.0
    frame $swin.$uid.f.1
    pack $swin.$uid.f.0 $swin.$uid.f.1 -side top -fill x
    label $swin.$uid.f.0.l -text "" -width 28 -font $pbfnt -anchor nw
    label $swin.$uid.f.1.l -text "" -width 28 -font $pbfnt -anchor nw
    pack $swin.$uid.f.0.l $swin.$uid.f.1.l -side top -fill x
    pack forget $swin.$uid.f.1

    for {set gy 0 }  { $gy <4} {incr gy } {
	frame $swin.$uid.g.$gy  
	pack $swin.$uid.g.$gy -side top -fill x -expand 1
	for { set gx 0 } {$gx < 4} {incr gx} {
	    if { [ expr $gx % 2] == 0 } {
		label $swin.$uid.g.$gy.$gx -text " " -width 13 -font $pbfnt -bg grey88 
	    } else { 
		label $swin.$uid.g.$gy.$gx -text " " -width 13 -font $pbfnt -bg grey85 
	    }
	    pack $swin.$uid.g.$gy.$gx -side left
	}
	label $swin.$uid.g.$gy.e -text "   " -width 3 -font $pbfnt -bg grey88
	pack $swin.$uid.g.$gy.e -side left
    }
    for {set gy 0 }  { $gy <4} {incr gy } {
	pack forget $swin.$uid.g.$gy 
    }

     set my 0
     for {set i 0} {$i < 4 } { incr i } {
 	frame $swin.$uid.m.$i
 	pack $swin.$uid.m.$i -side top -expand 1
 	label $swin.$uid.m.$i.m -text "" -width 13 -font $pbfnt 
 	label $swin.$uid.m.$i.s -text ""  -width 20 -font $pbfnt 
 	pack  $swin.$uid.m.$i.m  $swin.$uid.m.$i.s -side left
     }
     for {set i 0} {$i < 4 } { incr i } {
	 pack forget  $swin.$uid.m.$i
     }
}
proc clearUserLine {swin uid} {
    $swin.$uid.n.l configure -text ""
    $swin.$uid.f.0.l configure -text ""
    $swin.$uid.f.1.l configure -text ""

    for {set gy 0 }  { $gy <4} {incr gy } {
	for { set gx 0 } {$gx < 4} {incr gx} {
	    $swin.$uid.g.$gy.$gx  configure -text " " 
	}
	pack forget $swin.$uid.g.$gy -side top -fill x -expand 1
    }
    for {set i 0} {$i < 4 } { incr i } {
	$swin.$uid.m.$i.m configure -text ""
	$swin.$uid.m.$i.s configure -text ""
    }
 
    for {set i 0} {$i < 4 } { incr i } {
	$swin.$uid.m.$i.m configure -text ""
	$swin.$uid.m.$i.s configure -text ""
	pack forget $swin.$uid.m.$i
    }   
}
proc fillUserLine {swin uid} {
    global idByUser uName uFullName uGroups uMail uSMTP
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    global uDontList

    if { $uDontList($uid) == 1 } {
	set fgc Grey40
    } else {
	set fgc black
    }
    $swin.$uid.n.l configure -text $uName($uid) -fg $fgc
    if { [ string length $uFullName($uid) ] > 28 } {
	set pos [ string last " " $uFullName($uid) ]
	while { $pos > 28 } {
	    set pos [ string last " " $uFullName($uid)  $pos]
	}
	pack $swin.$uid.f.1 -side top -fill x
	$swin.$uid.f.0.l configure -text [string trim [string range $uFullName($uid) 0 $pos]] -fg $fgc
	$swin.$uid.f.1.l configure -text [string trim [string range $uFullName($uid) $pos end]] -fg $fgc
    } else {
	$swin.$uid.f.0.l  configure -text $uFullName($uid) -fg $fgc
    }

    set linEna(0) 1
    set linEna(1) 1
    set linEna(2) 0
    set linEna(3) 0

    set gx -1
    set gy 0
    foreach group $uGroups($uid) {
	incr gx
	if {$gx >3 } { 
	    if { $gy >= 3 } {
		$swin.$uid.g.$gy.e configure -text "..." -fg $fgc
		break
	    }
	    incr gy
	    set gx 0
	}
	$swin.$uid.g.$gy.$gx configure -text $group  -fg $fgc
	set linEna($gy) 1
    }

    set my 0
    for {set i 0} {$i < 4 } { incr i } {
 	if { [lindex $uMail($uid) $i] != "-" } {
 	    $swin.$uid.m.$my.m configure -text [lindex $uMail($uid) $i] -fg $fgc
 	    if {[lindex $uSMTP($uid) $i] != "-" } {
		$swin.$uid.m.$my.s configure -text [format "via %s" [lindex $uSMTP($uid) $i] ]  -fg $fgc
 	    }
	    set linEna($my) 1
 	    incr my 
 	} 
    }
    for {set i 0} {$i<4} {incr i} {
	pack $swin.$uid.g.$i -side top
	pack $swin.$uid.m.$i -side top
	if { $linEna($i)==0} {
	    pack forget $swin.$uid.g.$i -side top
	    pack forget $swin.$uid.m.$i -side top
	}
    }
}

proc addUser { } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    set uid [ nextUID]
    set win [ .t.nb subwidget users ]
    set swin [ $win.w subwidget window]
    initUser $uid
    frame $swin.$uid -relief ridge -bd 2
    pack $swin.$uid -fill x -side top 
    addUserLine $swin $uid
    editUserDialog $uid
}
proc nextUID { } {
    global uName
    set uid [ lindex [ lsort -integer [ array names uName] ] end ]
    incr uid
    return $uid
}
proc initUser { uid } {
    global idByUser uName uFullName uGroups uMail uSMTP uColor1 uColor2 uDontList uNotify
    set  uName($uid) ""
    set  uFullName($uid) ""
    set  uGroups($uid) ""
    set  uMail($uid) ""
    set  uSMTP($uid) ""
    set uColor1 "#000000"
    set uColor2 "#000000"
    set uDontList 0
    set uNotify ""
}
proc editUser { } {
    global curWin
    set list [ split $curWin .]
    set p [expr  [llength $list ] -3]
    set uid [lindex $list $p]
    editUserDialog  $uid
}
proc editUserDialog { uid } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt
    global idByUser uName uFullName uGroups uMail uSMTP  uColor1 uColor2 uDontList uNotify
    global gName editUid nList
    global mail0 mail1 mail2 mail3 smtp0 smtp1 smtp2 smtp3 unam ufull uglist
    global dontListUser ucol1 ucol2

    set editUid $uid
    set unam $uName($uid)
    set ufull $uFullName($uid)
    set uglist $uGroups($uid)
    set dontListUser $uDontList($uid)
    set nList $uNotify($uid)

    toplevel .eud
    frame .eud.t -relief raised -bd 1
    frame .eud.b
    pack .eud.t  .eud.b -side top -fill x

    frame .eud.t.0
    frame .eud.t.1
    frame .eud.t.2
    frame .eud.t.3
    frame .eud.t.4
    frame .eud.t.5
    frame .eud.t.6
    pack  .eud.t.0 .eud.t.1 .eud.t.2 .eud.t.3 .eud.t.4 .eud.t.5 .eud.t.6 -side top -fill x -pady 4


    label .eud.t.0.l -text "" -font $bfnt -width 8 -anchor nw
    label .eud.t.1.l -text "User name" -font $bfnt -width 12 -anchor nw
    label .eud.t.2.l -text "Full name" -font $bfnt -width 12 -anchor nw
    label .eud.t.3.l -text "Groups  " -font $bfnt -width 12 -anchor nw
    label .eud.t.4.l -text "Mail    " -font $bfnt -width 12 -anchor nw
    label .eud.t.5.l -text "Colors  " -font $bfnt -width 12 -anchor nw
    label .eud.t.6.l -text "Notifier" -font $bfnt -width 12 -anchor nw
    pack  .eud.t.0.l .eud.t.1.l .eud.t.2.l .eud.t.3.l .eud.t.4.l .eud.t.5.l .eud.t.6.l -side left 
    
    checkbutton .eud.t.0.c -text " Don't list this User" -variable dontListUser -font $bfnt 
    entry .eud.t.1.e -textvariable unam -font $pfnt -width 40
    entry .eud.t.2.e -textvariable ufull -font $pfnt -width 40
    frame .eud.t.3.e
    frame .eud.t.4.e
    frame .eud.t.5.e
    frame .eud.t.6.e
    pack .eud.t.0.c .eud.t.1.e .eud.t.2.e .eud.t.3.e .eud.t.4.e .eud.t.5.e .eud.t.6.e -side left 

    frame .eud.t.3.e.l 
    frame .eud.t.3.e.m 
    frame .eud.t.3.e.r
    pack .eud.t.3.e.l -side left -fill y
    pack .eud.t.3.e.m -side left -fill y -padx 4
    pack .eud.t.3.e.r -side left -fill y 
    tixScrolledListBox .eud.t.3.e.l.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567" ]\
	-options {listbox.selectMode extended}
    foreach group $uglist {
	.eud.t.3.e.l.b subwidget listbox insert end  $group
    }
    .eud.t.3.e.l.b subwidget listbox configure -font $pfnt
    .eud.t.3.e.l.b subwidget vsb configure -width 10
    pack .eud.t.3.e.l.b -side top
    button .eud.t.3.e.m.in  -text " << " -font $bfnt -command addGroup4CurUser
    button .eud.t.3.e.m.out -text " >> " -font $bfnt -command removeGroup4CurUser
    pack .eud.t.3.e.m.in  -side top
    pack .eud.t.3.e.m.out -side bottom
    tixScrolledListBox .eud.t.3.e.r.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567" ]\
	-options {listbox.selectMode extended}
    .eud.t.3.e.r.b subwidget listbox configure -font $pfnt
    .eud.t.3.e.r.b subwidget vsb configure -width 10
    pack .eud.t.3.e.r.b -side top
    foreach gid  [lsort [array names gName] ] {
	.eud.t.3.e.r.b subwidget listbox insert end  $gName($gid)
    }


    for {set i 0 } {$i <4 } { incr i } {
	frame .eud.t.4.$i
	pack  .eud.t.4.$i -side top -fill x
	set mail$i [lindex $uMail($uid) $i]
	if { [set mail$i ] == "-" } { set mail$i ""}
	set smtp$i [lindex $uSMTP($uid) $i]
	if { [set smtp$i ] == "-" } { set smtp$i ""}
	entry .eud.t.4.$i.m -textvariable mail$i -font $pfnt -width 15
	label .eud.t.4.$i.v -text " via "  -font $bfnt
	entry .eud.t.4.$i.s -textvariable smtp$i -font $pfnt  -width 20
	pack .eud.t.4.$i.m  .eud.t.4.$i.v  .eud.t.4.$i.s -side left
    }


    regsub \# $uColor1($uid) "" ucol1
    regsub \# $uColor2($uid) "" ucol2
    frame .eud.t.5.e.1
    frame .eud.t.5.e.2
    pack .eud.t.5.e.1 .eud.t.5.e.2 -side left
    label .eud.t.5.e.1.l -text "#" -font $bfnt
    label .eud.t.5.e.2.l -text "                  #" -font $bfnt
    entry .eud.t.5.e.1.e -textvariable ucol1 -font $pfnt -width 6  -validate none -vcmd {setuColor1 %V}
    entry .eud.t.5.e.2.e -textvariable ucol2 -font $pfnt -width 6  -validate none -vcmd {setuColor2 %s}
    label .eud.t.5.e.1.s -text "" -width 2 -font $bfnt
    button .eud.t.5.e.1.c -relief flat -state disabled -bg  $uColor1($uid)
    label .eud.t.5.e.2.s -text "" -width 2 -font $bfnt
    button .eud.t.5.e.2.c -relief flat -state disabled -bg  $uColor2($uid)
    pack .eud.t.5.e.1.l .eud.t.5.e.2.l -side left
    pack .eud.t.5.e.1.e .eud.t.5.e.2.e -side left
    pack .eud.t.5.e.1.s .eud.t.5.e.2.s -side left
    pack .eud.t.5.e.1.c .eud.t.5.e.2.c -side left
    


    frame .eud.t.6.e.l 
    frame .eud.t.6.e.m 
    frame .eud.t.6.e.r
    pack .eud.t.6.e.l -side left -fill y
    pack .eud.t.6.e.m -side left -fill y -padx 4
    pack .eud.t.6.e.r -side left -fill y 
    tixScrolledListBox .eud.t.6.e.l.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567" ]\
	-options {listbox.selectMode extended}
    foreach group $nList {
	.eud.t.6.e.l.b subwidget listbox insert end  $group
    }
    .eud.t.6.e.l.b subwidget listbox configure -font $pfnt
    .eud.t.6.e.l.b subwidget vsb configure -width 10
    pack .eud.t.6.e.l.b -side top
    button .eud.t.6.e.m.in  -text " << " -font $bfnt -command addUser2Notify
    button .eud.t.6.e.m.out -text " >> " -font $bfnt -command removeUserFromNotify
    pack .eud.t.6.e.m.in  -side top
    pack .eud.t.6.e.m.out -side bottom
    tixScrolledListBox .eud.t.6.e.r.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567" ]\
	-options {listbox.selectMode extended}
    .eud.t.6.e.r.b subwidget listbox configure -font $pfnt
    .eud.t.6.e.r.b subwidget vsb configure -width 10
    pack .eud.t.6.e.r.b -side top
    foreach id  [lsort [array names uName] ] {
	.eud.t.6.e.r.b subwidget listbox insert end  $uName($id)
    }

    button .eud.b.can -text "Cancel" -command {destroy .eud}
    button .eud.b.ok  -text "Accept" -command acceptUserChanges
    pack .eud.b.can -side left
    pack .eud.b.ok -side right
    wm title .eud "Edit Minkowky-User"
#    centerWin .eud 384 312
#    update
#x    puts [wm geometry .eud]
    centerWin .eud 384 504
    .eud.t.5.e.1.e configure -validate focus
    .eud.t.5.e.2.e configure -validate focus
}
proc setuColor1 { type} {
    global ucol1 ucol1b
    
    if { $type == "focusin"} {
	set ucol1b $ucol1
	return 1
    }
    
    if { [regexp  {[^0-9a-fA-F]} $ucol1 ] == 1 } {
	set ucol1 $ucol1b
	return 0
    }
    if { [string length $ucol1 ] <6 } {
	set ucol1 $ucol1b
	return 0
    }
    if { [string length $ucol1 ] > 6} {
	set ucol1 [string range $ucol1 0 5]
    }
	
#    puts $ucol1
#    puts [regexp  {[^0-9a-fA-F]} $ucol1 ]
    set col "#$ucol1"
    .eud.t.5.e.1.c configure -bg $col
    return 1
}
proc setuColor2 { type} {
    global ucol2 ucol2b
    
    if { $type == "focusin"} {
	set ucol2b $ucol2
	return 1
    }
    
    if { [regexp  {[^0-9a-fA-F]} $ucol2 ] == 1 } {
	set ucol2 $ucol2b
	return 0
    }
    if { [string length $ucol2 ] <6 } {
	set ucol2 $ucol2b
	return 0
    }
    if { [string length $ucol2 ] > 6} {
	set ucol2 [string range $ucol2 0 5]
    }
	
#    puts $ucol2
#    puts [regexp  {[^0-9a-fA-F]} $ucol2 ]
    set col "#$ucol2"
    .eud.t.5.e.2.c configure -bg $col
    return 1
}
proc addGroup4CurUser {} {
    global uglist gName

    set groups [lsort [array names gName] ]
    set selection  [.eud.t.3.e.r.b subwidget listbox curselection]
    foreach sel $selection {
	set newGroup  $gName([lindex $groups $sel])
	if { [lsearch $uglist $newGroup] <0 } {
	    lappend uglist $newGroup
	}
    }    
    .eud.t.3.e.l.b subwidget listbox delete  0 end
    foreach group $uglist {
	.eud.t.3.e.l.b subwidget listbox insert end  $group
    }
}
proc removeGroup4CurUser { } {
    global uglist gName
    set selection  [.eud.t.3.e.l.b subwidget listbox curselection]
    foreach sel [lsort -integer -decreasing $selection] {
	set uglist [lreplace $uglist $sel $sel]
    }
    .eud.t.3.e.l.b subwidget listbox delete  0 end
    foreach group $uglist {
	.eud.t.3.e.l.b subwidget listbox insert end  $group
    }
	
}
proc addUser2Notify {} {
    global nList uName

    set users [lsort [array names uName] ]
    set selection  [.eud.t.6.e.r.b subwidget listbox curselection]
    foreach sel $selection {
	set nUser  $uName([lindex $users $sel])
	if { [lsearch $nList $nUser] <0 } {
	    lappend nList $nUser
	}
    }    
    .eud.t.6.e.l.b subwidget listbox delete  0 end
    foreach usr $nList {
	.eud.t.6.e.l.b subwidget listbox insert end  $usr
    }
}
proc removeUserFromNotify { } {
    global nList uName
    set selection  [.eud.t.6.e.l.b subwidget listbox curselection]
    foreach sel [lsort -integer -decreasing $selection] {
	set nList [lreplace $nList $sel $sel]
    }
    .eud.t.6.e.l.b subwidget listbox delete  0 end
    foreach usr $nList {
	.eud.t.6.e.l.b subwidget listbox insert end  $usr
    }
	
}

proc acceptUserChanges {  } {
    global idByUser uName uFullName uGroups uMail uSMTP  uColor1 uColor2 uDontList uNotify
    global mail0 mail1 mail2 mail3 smtp0 smtp1 smtp2 smtp3 unam ufull uglist
    global editUid dontListUser ucol1 ucol2 nList
    
    set uMail($editUid) ""
    set uSMTP($editUid) ""
    for {set i 0 } {$i <4 } { incr i } {
 	if { [set mail$i ] == "" } { set mail$i "-"}
 	if { [set smtp$i ] == "" } { set smtp$i "-"}
 	lappend uMail($editUid) [set mail$i]
 	lappend uSMTP($editUid) [set smtp$i]
    }
    set uName($editUid) $unam
    set uFullName($editUid) $ufull
    set uGroups($editUid) $uglist 
    set uNotify($editUid) $nList
    set uDontList($editUid) $dontListUser
    set uColor1($editUid) "\#$ucol1"
    set uColor2($editUid) "\#$ucol2"
    
    set win [ .t.nb subwidget users ]
    set swin [ $win.w subwidget window]
    clearUserLine $swin $editUid
    fillUserLine $swin $editUid
    destroy .eud
}


#######################################
#  Groups                             #
#######################################

proc drawGroupsTab { win } {
    global idByGroup gName gAdmin gPerm
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt

    frame $win.t 
    tixScrolledWindow $win.w   -width 960 -height 600 -scrollbar y
    frame $win.b
    pack $win.t $win.w  $win.b -side top -fill x

    label $win.t.e -text "    " -bd 1 -width 8 -font $pbfnt
    label $win.t.n -text " Group" -width 16 -font $pbfnt
    label $win.t.a -text " Admins" -width 66 -font $pbfnt
    label $win.t.p -text " Permissions:" -width 13 -font $pbfnt
    label $win.t.r -text " Admin" -width 12 -font $pbfnt
    label $win.t.m -text " Member" -width 12 -font $pbfnt
    label $win.t.o -text " Others " -width 10 -font $pbfnt
    pack $win.t.e  $win.t.n $win.t.a $win.t.p $win.t.r $win.t.m $win.t.o -side left 

    set swin [ $win.w subwidget window]
    foreach gid [ lsort -integer  [ array names gName] ] {
 	frame $swin.$gid -relief ridge -bd 2
 	pack $swin.$gid -fill x -side top 
	addGroupLine   $swin $gid
	clearGroupLine $swin $gid
	fillGroupLine  $swin $gid
    }
    button $win.b.n -text " New " -command addGroup  -width 5 -font $bfnt
    pack $win.b.n -side left
}
proc addGroupLine {swin gid} {
    global idByGroup gName gAdmin gPerm curWin
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt

    
    frame $swin.$gid.b -relief raised -bd 1
    frame $swin.$gid.g -relief raised -bd 1 -bg grey88
    frame $swin.$gid.a -relief raised -bd 1
    frame $swin.$gid.p -relief raised -bd 1 -bg grey88
    frame $swin.$gid.m -relief raised -bd 1
    frame $swin.$gid.o -relief raised -bd 1 -bg grey88
    pack  $swin.$gid.b $swin.$gid.g $swin.$gid.a $swin.$gid.p $swin.$gid.m $swin.$gid.o -side left -fill both
    
    button $swin.$gid.b.e -text "Edit" -font $bfnt  -width 5 -command editGroup
    bind $swin.$gid.b.e  <Button> {set curWin %W}
    label $swin.$gid.g.l -text "" -width 15 -font $pbfnt  -bg grey88  -anchor nw
    pack $swin.$gid.b.e $swin.$gid.g.l -side left -fill y
    
    set gx -1
    set gy 0
    
    for {set gy 0 }  { $gy <4} {incr gy } {
	frame $swin.$gid.a.$gy  
	pack $swin.$gid.a.$gy -side top -fill x -expand 1
	for { set gx 0 } {$gx < 5} {incr gx} {
	    if { [ expr $gx % 2] == 0 } {
		label $swin.$gid.a.$gy.$gx -text " " -width 15 -font $pbfnt -bg grey88 
	    } else { 
		label $swin.$gid.a.$gy.$gx -text " " -width 15 -font $pbfnt -bg grey85 
	    }
	    pack $swin.$gid.a.$gy.$gx -side left
	}
	label $swin.$gid.a.$gy.e -text "   " -width 3 -font $pbfnt -bg grey88
	pack $swin.$gid.a.$gy.e -side left
    }
    for {set gy 0 }  { $gy <4} {incr gy } {
	pack forget $swin.$gid.a.$gy 
    }
     
    label $swin.$gid.p.l -text "" -width 12 -font $pbfnt  -bg grey88  -anchor nw
    label $swin.$gid.m.l -text "" -width 12 -font $pbfnt  -bg grey88  -anchor nw
    label $swin.$gid.o.l -text "" -width 12 -font $pbfnt  -bg grey88  -anchor nw
    pack $swin.$gid.p.l  $swin.$gid.m.l $swin.$gid.o.l -side left -fill y
}
proc clearGroupLine {swin gid} {
    $swin.$gid.g.l configure -text ""
    for {set gy 0 }  { $gy <4} {incr gy } {
	for { set gx 0 } {$gx < 5} {incr gx} {
	    $swin.$gid.a.$gy.$gx configure -text " "
	}
	pack forget $swin.$gid.a.$gy
    }
    $swin.$gid.p.l configure -text "" 
    $swin.$gid.m.l configure -text "" 
    $swin.$gid.o.l configure -text "" 
}
proc fillGroupLine {swin gid} {
    global idByGroup gName gAdmin gPerm gDontList

    if { $gDontList($gid) == 1} {
	set fgc gray40
    } else {
	set fgc black
    }
 
    $swin.$gid.g.l configure -text $gName($gid) -fg $fgc

    set linEna(0) 1
    set linEna(1) 1
    set linEna(2) 0
    set linEna(3) 0
    
     set gx -1
    set gy 0
    foreach admin $gAdmin($gid) {
	incr gx 
	if {$gx >4 } { 
	    if { $gy >= 3 } {
		$swin.$gid.a.$gy.e configure -text "..." -fg $fgc
		break
	    }
	    incr gy
	    set gx 0
	}
	$swin.$gid.a.$gy.$gx configure -text $admin -fg $fgc
	set linEna($gy) 1
    }
    for {set i 0} {$i<4} {incr i} {
	pack $swin.$gid.a.$i -side top
	if { $linEna($i)==0} {
	    pack forget $swin.$gid.a.$i -side top
	}
    }

    $swin.$gid.p.l configure -text [lindex $gPerm($gid) 0] -fg $fgc
    $swin.$gid.m.l configure -text [lindex $gPerm($gid) 1] -fg $fgc
    $swin.$gid.o.l configure -text [lindex $gPerm($gid) 2] -fg $fgc
}
proc addGroup { } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    set gid [ nextGID]
    set win [ .t.nb subwidget groups ]
    set swin [ $win.w subwidget window]
    initGroup $gid
    frame $swin.$gid -relief ridge -bd 2
    pack $swin.$gid -fill x -side top 
    addGroupLine $swin $gid
    editGroupDialog $gid
}
proc nextGID { } {
    global gName
    set gid [ lindex [ lsort -integer [ array names gName] ] end ]
    incr gid
    return $gid
}
proc initGroup { gid } {
    global idByGroup gName gAdmin gPerm gColor gDontList
    set  gName($gid) ""
    set  gAdmin($gid) ""
    set  gPerm($gid) "--------- --------- ---------"
    set  gColor($gid) "#000000"
    set  gDontList($gid) 0
}
proc editGroup { } {
    global curWin
    set list [ split $curWin .]
    set p [expr  [llength $list ] -3]
    set gid [lindex $list $p]
    editGroupDialog  $gid
}

proc editGroupDialog { gid } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    global idByGroup gName gAdmin gPerm gaList editGid gnam uName gColor gDontList
    global dontListGroup gcol
    global gpermAR0 gpermAR1 gpermAR2 gpermAR3 gpermAC0 gpermAC1 gpermAC2 gpermAC3 gpermAD  
    global gpermMR0 gpermMR1 gpermMR2 gpermMR3 gpermMC0 gpermMC1 gpermMC2 gpermMC3 gpermMD  
    global gpermOR0 gpermOR1 gpermOR2 gpermOR3 gpermOC0 gpermOC1 gpermOC2 gpermOC3 gpermOD  1

    set editGid $gid
    set gnam $gName($gid)
    set gaList $gAdmin($gid)
    set dontListGroup $gDontList($gid)

    set gpermAR0 1
    set gpermAR1 1
    set gpermAR2 1
    set gpermAR3 1
    set gpermAC0 1
    set gpermAC1 1
    set gpermAC2 1
    set gpermAC3 1
    set gpermAD  1
    set gpermMR0 1
    set gpermMR1 1
    set gpermMR2 1
    set gpermMR3 1
    set gpermMC0 1
    set gpermMC1 1
    set gpermMC2 1
    set gpermMC3 1
    set gpermMD  1
    set gpermOR0 1
    set gpermOR1 1
    set gpermOR2 1
    set gpermOR3 1
    set gpermOC0 1
    set gpermOC1 1
    set gpermOC2 1
    set gpermOC3 1
    set gpermOD  1

    if { [string index [lindex $gPerm($gid) 0] 0] == "-" } { set gpermAR0 0 }
    if { [string index [lindex $gPerm($gid) 0] 1] == "-" } { set gpermAR1 0 }
    if { [string index [lindex $gPerm($gid) 0] 2] == "-" } { set gpermAR2 0 }
    if { [string index [lindex $gPerm($gid) 0] 3] == "-" } { set gpermAR3 0 }
    if { [string index [lindex $gPerm($gid) 0] 4] == "-" } { set gpermAC0 0 }
    if { [string index [lindex $gPerm($gid) 0] 5] == "-" } { set gpermAC1 0 }
    if { [string index [lindex $gPerm($gid) 0] 6] == "-" } { set gpermAC2 0 }
    if { [string index [lindex $gPerm($gid) 0] 7] == "-" } { set gpermAC3 0 }
    if { [string index [lindex $gPerm($gid) 0] 8] == "-" } { set gpermAD  0 }

    if { [string index [lindex $gPerm($gid) 1] 0] == "-" } { set gpermMR0 0 }
    if { [string index [lindex $gPerm($gid) 1] 1] == "-" } { set gpermMR1 0 }
    if { [string index [lindex $gPerm($gid) 1] 2] == "-" } { set gpermMR2 0 }
    if { [string index [lindex $gPerm($gid) 1] 3] == "-" } { set gpermMR3 0 }
    if { [string index [lindex $gPerm($gid) 1] 4] == "-" } { set gpermMC0 0 }
    if { [string index [lindex $gPerm($gid) 1] 5] == "-" } { set gpermMC1 0 }
    if { [string index [lindex $gPerm($gid) 1] 6] == "-" } { set gpermMC2 0 }
    if { [string index [lindex $gPerm($gid) 1] 7] == "-" } { set gpermMC3 0 }
    if { [string index [lindex $gPerm($gid) 1] 8] == "-" } { set gpermMD  0 }

    if { [string index [lindex $gPerm($gid) 2] 0] == "-" } { set gpermOR0 0 }
    if { [string index [lindex $gPerm($gid) 2] 1] == "-" } { set gpermOR1 0 }
    if { [string index [lindex $gPerm($gid) 2] 2] == "-" } { set gpermOR2 0 }
    if { [string index [lindex $gPerm($gid) 2] 3] == "-" } { set gpermOR3 0 }
    if { [string index [lindex $gPerm($gid) 2] 4] == "-" } { set gpermOC0 0 }
    if { [string index [lindex $gPerm($gid) 2] 5] == "-" } { set gpermOC1 0 }
    if { [string index [lindex $gPerm($gid) 2] 6] == "-" } { set gpermOC2 0 }
    if { [string index [lindex $gPerm($gid) 2] 7] == "-" } { set gpermOC3 0 }
    if { [string index [lindex $gPerm($gid) 2] 8] == "-" } { set gpermOD  0 }



    toplevel .egd
    frame .egd.t -relief raised -bd 1
    frame .egd.b
    pack .egd.t  .egd.b -side top -fill x

    frame .egd.t.0
    frame .egd.t.1
    frame .egd.t.2
    frame .egd.t.3
    frame .egd.t.4
    pack  .egd.t.0 .egd.t.1 .egd.t.2 .egd.t.3 .egd.t.4 -side top -fill x -pady 4

    label .egd.t.0.l -text "" -font $bfnt -width 8 -anchor nw
    label .egd.t.1.l -text "Group name" -font $bfnt -width 12 -anchor nw
    label .egd.t.2.l -text "Color   " -font $bfnt -width 12 -anchor nw
    label .egd.t.3.l -text "Admins" -font $bfnt -width 12 -anchor nw
    label .egd.t.4.l -text "Permissions" -font $bfnt -width 12 -anchor nw
    pack  .egd.t.0.l .egd.t.1.l  .egd.t.2.l .egd.t.3.l .egd.t.4.l -side left 
    checkbutton .egd.t.0.c -text " Don't list this User" -variable dontListGroup -font $bfnt 
    entry .egd.t.1.e -textvariable gnam -font $pfnt -width 40
    frame .egd.t.2.e
    frame .egd.t.3.e
    frame .egd.t.4.e
    pack  .egd.t.0.c .egd.t.1.e .egd.t.2.e  .egd.t.3.e  .egd.t.4.e   -side left 

    regsub \# $gColor($gid) "" gol
    label .egd.t.2.e.l -text "#" -font $bfnt
    entry .egd.t.2.e.e -textvariable gcol -font $pfnt -width 6  -validate none -vcmd {setgColor %V}
    label .egd.t.2.e.s -text "" -width 2 -font $bfnt
    button .egd.t.2.e.c -relief flat -state disabled -bg  $gColor($gid)
    pack   .egd.t.2.e.l .egd.t.2.e.e .egd.t.2.e.s .egd.t.2.e.c   -side left 

    frame .egd.t.3.e.l 
    frame .egd.t.3.e.m 
    frame .egd.t.3.e.r
    pack .egd.t.3.e.l -side left -fill y
    pack .egd.t.3.e.m -side left -fill y -padx 4
    pack .egd.t.3.e.r -side left -fill y 
    tixScrolledListBox .egd.t.3.e.l.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567890" ]\
	-options {listbox.selectMode extended}
    foreach admin $gaList {
	.egd.t.3.e.l.b subwidget listbox insert end  $admin
    }
    .egd.t.3.e.l.b subwidget listbox configure -font $pfnt
    .egd.t.3.e.l.b subwidget vsb configure -width 10
    pack .egd.t.3.e.l.b -side top
    button .egd.t.3.e.m.in  -text " << " -font $bfnt -command addAdmin2Grooup
    button .egd.t.3.e.m.out -text " >> " -font $bfnt -command removeAdminFromCurGroup
    pack .egd.t.3.e.m.in  -side top
    pack .egd.t.3.e.m.out -side bottom
    tixScrolledListBox .egd.t.3.e.r.b -scrollbar y -height 120 -width [ font measure $pfnt "12345678901234567890" ]\
	-options {listbox.selectMode extended}
    .egd.t.3.e.r.b subwidget listbox configure -font $pfnt
    .egd.t.3.e.r.b subwidget vsb configure -width 10
    pack .egd.t.3.e.r.b -side top
    foreach uid  [lsort [array names uName] ] {
	.egd.t.3.e.r.b subwidget listbox insert end  $uName($uid)
    }

    frame .egd.t.4.b
    frame .egd.t.4.a
    frame .egd.t.4.o
    frame .egd.t.4.m
    pack .egd.t.4.b .egd.t.4.a .egd.t.4.m .egd.t.4.o   -side left -fill x
    
    label  .egd.t.4.b.h -text "" -width 11 -font $bfnt
    label  .egd.t.4.a.h -text "Admins" -width 11 -font $bfnt
    label  .egd.t.4.o.h -text "Members" -width 11 -font $bfnt
    label  .egd.t.4.m.h -text "Others" -width 11 -font $bfnt
    label  .egd.t.4.b.l -text "" -width 11 -font $bfnt10
    label  .egd.t.4.a.l -text "Read/Change" -width 11 -font $bfnt10
    label  .egd.t.4.o.l -text "Read/Change" -width 11 -font $bfnt10
    label  .egd.t.4.m.l -text "Read/Change" -width 11 -font $bfnt10
    frame  .egd.t.4.b.p 
    frame  .egd.t.4.a.p 
    frame  .egd.t.4.o.p 
    frame  .egd.t.4.m.p 
    label  .egd.t.4.b.d -text "Delete" -width 11 -font $bfnt
    checkbutton .egd.t.4.a.d -variable gpermAD 
    checkbutton .egd.t.4.m.d -variable gpermMD 
    checkbutton .egd.t.4.o.d -variable gpermOD 
    foreach l "b a o m" { pack .egd.t.4.$l.h .egd.t.4.$l.l .egd.t.4.$l.p   .egd.t.4.$l.d -side top  -fill x}
    
    for {set i 0} {$i<4} {incr i } {
	frame .egd.t.4.b.p.$i
	frame .egd.t.4.a.p.$i
	frame .egd.t.4.m.p.$i
	frame .egd.t.4.o.p.$i
	pack .egd.t.4.b.p.$i .egd.t.4.a.p.$i .egd.t.4.m.p.$i .egd.t.4.o.p.$i -side top -fill x

	checkbutton .egd.t.4.a.p.$i.r -variable gpermAR$i -state normal 
	checkbutton .egd.t.4.a.p.$i.c -variable gpermAC$i -state normal 
	checkbutton .egd.t.4.m.p.$i.r -variable gpermMR$i -state normal 
	checkbutton .egd.t.4.m.p.$i.c -variable gpermMC$i -state normal 
	checkbutton .egd.t.4.o.p.$i.r -variable gpermOR$i -state normal 
	checkbutton .egd.t.4.o.p.$i.c -variable gpermOC$i  -state normal 
	foreach l "a o m"  { pack  .egd.t.4.$l.p.$i.r .egd.t.4.$l.p.$i.c -side left -fill x}
    }
    label .egd.t.4.b.p.0.l -text "Times/Rooms" -font $bfnt
    label .egd.t.4.b.p.1.l -text "Titles" -font $bfnt
    label .egd.t.4.b.p.2.l -text "Participant" -font $bfnt
    label .egd.t.4.b.p.3.l -text "Comment" -font $bfnt
    pack .egd.t.4.b.p.0.l .egd.t.4.b.p.1.l .egd.t.4.b.p.2.l .egd.t.4.b.p.3.l -side left -fill x -pady 3
    

    button .egd.b.can -text "Cancel" -command {destroy .egd}
    button .egd.b.ok  -text "Accept" -command acceptGroupChanges
    pack .egd.b.can -side left
    pack .egd.b.ok -side right
    wm title .egd "Edit Minkowky-Groups"
#     update
#     puts [wm geometry .egd]
    centerWin .egd 424 404
}
proc setgColor { type} {
    global gcol gcolb
    
    if { $type == "focusin"} {
	set gcolb $gcol
	return 1
    }
    
    if { [regexp  {[^0-9a-fA-F]} $gcol ] == 1 } {
	set gcol $gcolb
	return 0
    }
    if { [string length $gcol ] <6 } {
	set gcol $gcolb
	return 0
    }
    if { [string length $gcol ] > 6} {
	set gcol [string range $gcol 0 5]
    }
	
#    puts $gcol
#    puts [regexp  {[^0-9a-fA-F]} $gcol ]
    set col "#$gcol"
    .egd.t.2.e.c configure -bg $col
    return 1
}
proc addAdmin2Grooup {} {
    global gaList uName
    
    set users [lsort [array names uName] ]
    set selection  [.egd.t.3.e.r.b subwidget listbox curselection]
    foreach sel $selection {
	set newAdmin  $uName([lindex $users $sel])
	if { [lsearch $gaList $newAdmin] <0 } {
	    lappend gaList $newAdmin
	}
    }    
    .egd.t.3.e.l.b subwidget listbox delete  0 end
    foreach admin $gaList {
	.egd.t.3.e.l.b subwidget listbox insert end  $admin
    }

}
proc removeAdminFromCurGroup {} {
    global gaList uName

    set selection  [.egd.t.3.e.l.b subwidget listbox curselection]
    foreach sel [lsort -integer -decreasing $selection] {
	set gaList [lreplace $gaList $sel $sel]
    }
    .egd.t.3.e.l.b subwidget listbox delete  0 end
    foreach admin $gaList {
	.egd.t.3.e.l.b subwidget listbox insert end  $admin
    }
}

proc acceptGroupChanges {} {
    global idByGroup gName gAdmin gPerm gaList editGid gnam uName gColor gDontList
    global dontListGroup gcol
    global gpermAR0 gpermAR1 gpermAR2 gpermAR3 gpermAC0 gpermAC1 gpermAC2 gpermAC3 gpermAD  
    global gpermMR0 gpermMR1 gpermMR2 gpermMR3 gpermMC0 gpermMC1 gpermMC2 gpermMC3 gpermMD  
    global gpermOR0 gpermOR1 gpermOR2 gpermOR3 gpermOC0 gpermOC1 gpermOC2 gpermOC3 gpermOD  1

    set gid $editGid 
    set gName($gid) $gnam
    set gAdmin($gid) $gaList 
    set gColor($gid) $gcol
    set gDontList($gid) $dontListGroup

    set gpermA "---------"
    set gpermM "---------"
    set gpermO "---------"

    if { $gpermAR0 == 1} { set gpermA [ string replace $gpermA 0 0 "z"] }
    if { $gpermAR1 == 1} { set gpermA [ string replace $gpermA 1 1 ""] }
    if { $gpermAR2 == 1} { set gpermA [ string replace $gpermA 2 2 "t"] }
    if { $gpermAR3 == 1} { set gpermA [ string replace $gpermA 3 3 "k"] }
    if { $gpermAC0 == 1} { set gpermA [ string replace $gpermA 4 4 "z"] }
    if { $gpermAC1 == 1} { set gpermA [ string replace $gpermA 5 5 ""] }
    if { $gpermAC2 == 1} { set gpermA [ string replace $gpermA 6 6 "t"] }
    if { $gpermAC3 == 1} { set gpermA [ string replace $gpermA 7 7 "k"] }
    if { $gpermAD  == 1} { set gpermA [ string replace $gpermA 8 8 "d"] }
    if { $gpermMR0 == 1} { set gpermM [ string replace $gpermM 0 0 "z"] }
    if { $gpermMR1 == 1} { set gpermM [ string replace $gpermM 1 1 ""] }
    if { $gpermMR2 == 1} { set gpermM [ string replace $gpermM 2 2 "t"] }
    if { $gpermMR3 == 1} { set gpermM [ string replace $gpermM 3 3 "k"] }
    if { $gpermMC0 == 1} { set gpermM [ string replace $gpermM 4 4 "z"] }
    if { $gpermMC1 == 1} { set gpermM [ string replace $gpermM 5 5 ""] }
    if { $gpermMC2 == 1} { set gpermM [ string replace $gpermM 6 6 "t"] }
    if { $gpermMC3 == 1} { set gpermM [ string replace $gpermM 7 7 "k"] }
    if { $gpermMD  == 1} { set gpermM [ string replace $gpermM 8 8 "d"] }
    if { $gpermOR0 == 1} { set gpermO [ string replace $gpermO 0 0 "z"] }
    if { $gpermOR1 == 1} { set gpermO [ string replace $gpermO 1 1 ""] }
    if { $gpermOR2 == 1} { set gpermO [ string replace $gpermO 2 2 "t"] }
    if { $gpermOR3 == 1} { set gpermO [ string replace $gpermO 3 3 "k"] }
    if { $gpermOC0 == 1} { set gpermO [ string replace $gpermO 4 4 "z"] }
    if { $gpermOC1 == 1} { set gpermO [ string replace $gpermO 5 5 ""] }
    if { $gpermOC2 == 1} { set gpermO [ string replace $gpermO 6 6 "t"] }
    if { $gpermOC3 == 1} { set gpermO [ string replace $gpermO 7 7 "k"] }
    if { $gpermOD  == 1} { set gpermO [ string replace $gpermO 8 8 "d"] }

    set gPerm($gid) "$gpermA $gpermM $gpermO"


    set win [ .t.nb subwidget groups ]
    set swin [ $win.w subwidget window]
    clearGroupLine $swin $editGid
    fillGroupLine $swin $editGid
    destroy .egd
}



####################################
# Rooms                            #
####################################

proc drawRoomsTab { win } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt
    global idByRoom rName rDetails rPerm

    frame $win.t 
    tixScrolledWindow $win.w   -width 960 -height 600 -scrollbar y
    frame $win.b
    pack $win.t $win.w  $win.b -side top -fill x

    label $win.t.e -text "    " -bd 1 -width 9 -font $pbfnt
    label $win.t.n -text " Room" -width 20 -font $pbfnt
    label $win.t.d -text " Details" -width 100 -font $pbfnt
    label $win.t.p -text " Permissions" -width 12 -font $pbfnt
    pack $win.t.e  $win.t.n $win.t.d $win.t.p -side left 

    set swin [ $win.w subwidget window]
    foreach rid [ lsort -integer  [ array names rName] ] {
 	frame $swin.$rid -relief ridge -bd 2
 	pack $swin.$rid -fill x -side top 
	addRoomLine   $swin $rid
	clearRoomLine $swin $rid
	fillRoomLine  $swin $rid
    }
    button $win.b.n -text " New " -command addRoom  -width 5 -font $bfnt
    pack $win.b.n -side left
}

proc  addRoomLine { swin rid } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin

    frame $swin.$rid.b -relief raised -bd 1
    frame $swin.$rid.r -relief raised -bd 1 -bg grey88
    frame $swin.$rid.d -relief raised -bd 1
    frame $swin.$rid.p -relief raised -bd 1 -bg grey88
    pack  $swin.$rid.b $swin.$rid.r $swin.$rid.d $swin.$rid.p -side left -fill both
    
    button $swin.$rid.b.e -text "Edit" -font $bfnt  -width 5 -command editRoom
    bind $swin.$rid.b.e  <Button> {set curWin %W}
    label $swin.$rid.r.l -text "" -width 20 -font $pbfnt -bg grey87 
    label $swin.$rid.d.l -text "" -width 100 -font $pbfnt 
    label $swin.$rid.p.l -text "" -width 12 -font $pbfnt -bg grey87 
    pack $swin.$rid.b.e  $swin.$rid.r.l  $swin.$rid.d.l $swin.$rid.p.l -side left 
    bind $swin.$rid.b.e  <Button> {set curWin %W}
    
}
proc  clearRoomLine { swin rid } {
    global idByRoom rName rDetails rPerm
    $swin.$rid.r.l configure  -text ""
    $swin.$rid.d.l configure -text ""
    $swin.$rid.p.l configure -text ""
}
proc  fillRoomLine { swin rid } {
    global idByRoom rName rDetails rPerm
    $swin.$rid.r.l configure  -text $rName($rid) 
    $swin.$rid.d.l configure -text $rDetails($rid) 
    $swin.$rid.p.l configure -text $rPerm($rid) 
}

proc addRoom { } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    set rid [ nextRID]
    set win [ .t.nb subwidget rooms ]
    set swin [ $win.w subwidget window]
    initRoom $rid
    frame $swin.$rid -relief ridge -bd 2
    pack $swin.$rid -fill x -side top 
    addRoomLine $swin $rid
    editRoomDialog $rid
}
proc nextRID { } {
    global rName
    set rid [ lindex [ lsort -integer [ array names rName] ] end ]
    incr rid
    return $rid
}
proc initRoom { rid } {
    global idByRoom rName rDetails rPerm
    set  rName($rid) ""
    set  rDetails($rid) ""
    set  rPerm($rid) "---------"
}
proc editRoom { } {
    global curWin
    set list [ split $curWin .]
    set p [expr  [llength $list ] -3]
    set rid [lindex $list $p]
    editRoomDialog  $rid
}
proc editRoomDialog { rid } {
    global fnt10 fnt fnt14 fnt18  bfnt10 bfnt bfnt14 bfnt18  pfnt pbfnt curWin
    global idByRoom rName rDetails rPerm editRid
    global rnam rdet rpermR0 rpermR1 rpermR2 rpermR3 rpermC0 rpermC1 rpermC2 rpermC3 rpermD

    set editRid $rid
    set rnam $rName($rid)
    set rdet $rDetails($rid)

    set rpermR0 1
    set rpermR1 1
    set rpermR2 1
    set rpermR3 1
    set rpermC0 1
    set rpermC1 1
    set rpermC2 1
    set rpermC3 1
    set rpermD  1
    if { [string index $rPerm($rid) 0] == "-" } { set rpermR0 0 }
    if { [string index $rPerm($rid) 1] == "-" } { set rpermR1 0 }
    if { [string index $rPerm($rid) 2] == "-" } { set rpermR2 0 }
    if { [string index $rPerm($rid) 3] == "-" } { set rpermR3 0 }
    if { [string index $rPerm($rid) 4] == "-" } { set rpermC0 0 }
    if { [string index $rPerm($rid) 5] == "-" } { set rpermC1 0 }
    if { [string index $rPerm($rid) 6] == "-" } { set rpermC2 0 }
    if { [string index $rPerm($rid) 7] == "-" } { set rpermC3 0 }
    if { [string index $rPerm($rid) 8] == "-" } { set rpermD  0 }

    toplevel .erd
    frame .erd.t -relief raised -bd 1
    frame .erd.b
    pack .erd.t  .erd.b -side top -fill x

    frame .erd.t.0
    frame .erd.t.1
    frame .erd.t.2
    pack  .erd.t.0 .erd.t.1 .erd.t.2 -side top -fill x -pady 4

    label .erd.t.0.l -text "Room name" -font $bfnt -width 12 -anchor nw
    label .erd.t.1.l -text "Details" -font $bfnt -width 12 -anchor nw
    label .erd.t.2.l -text "Permissions" -font $bfnt -width 12 -anchor nw
    pack .erd.t.0.l .erd.t.1.l .erd.t.2.l -side left 
    entry .erd.t.0.e -textvariable rnam -font $pfnt -width 40
    text  .erd.t.1.e -width 40 -height 4 -wrap word
    .erd.t.1.e insert end $rDetails($rid)
    frame .erd.t.2.e
    pack  .erd.t.0.e  .erd.t.1.e  .erd.t.2.e   -side left 

    frame .erd.t.2.b
    frame .erd.t.2.p
    pack .erd.t.2.b .erd.t.2.p -side left -fill x

    label  .erd.t.2.b.l -text "" -width 11 -font $bfnt10
    label  .erd.t.2.p.l -text "Read/Change" -width 16 -font $bfnt10
    frame  .erd.t.2.b.p 
    frame  .erd.t.2.p.p 
    label  .erd.t.2.b.d -text "Delete" -width 11 -font $bfnt
    checkbutton .erd.t.2.p.d -variable rpermD 
    pack .erd.t.2.b.l .erd.t.2.b.p .erd.t.2.b.d -side top  -fill x
    pack .erd.t.2.p.l .erd.t.2.p.p .erd.t.2.p.d -side top  -fill x
    for {set i 0} {$i<4} {incr i } {
	frame .erd.t.2.b.p.$i
	frame .erd.t.2.p.p.$i
	pack .erd.t.2.b.p.$i .erd.t.2.p.p.$i  -side top -fill x
	checkbutton .erd.t.2.p.p.$i.r -variable rpermR$i -state normal 
	checkbutton .erd.t.2.p.p.$i.c -variable rpermC$i -state normal 
	pack .erd.t.2.p.p.$i.r  .erd.t.2.p.p.$i.c -side left -fill x
    }
    label .erd.t.2.b.p.0.l -text "Times/Rooms" -font $bfnt
    label .erd.t.2.b.p.1.l -text "Titles" -font $bfnt
    label .erd.t.2.b.p.2.l -text "Participant" -font $bfnt
    label .erd.t.2.b.p.3.l -text "Comment" -font $bfnt
    pack .erd.t.2.b.p.0.l .erd.t.2.b.p.1.l .erd.t.2.b.p.2.l .erd.t.2.b.p.3.l -side left -fill x -pady 3

    button .erd.b.can -text "Cancel" -command {destroy .erd}
    button .erd.b.ok  -text "Accept" -command acceptRoomChanges
    pack .erd.b.can -side left
    pack .erd.b.ok -side right
    wm title .erd "Edit Minkowky-Rooms"
    centerWin .erd 380 264
}

proc acceptRoomChanges {} {
    global idByRoom rName rDetails rPerm editRid
    global rnam rdet rpermR0 rpermR1 rpermR2 rpermR3 rpermC0 rpermC1 rpermC2 rpermC3 rpermD

    set rid $editRid
    set rName($rid) $rnam
#    set rDetails($rid) [ .erd.t.1.e dump  -text  0.0 end]
    set rdet [ .erd.t.1.e get  0.0 end]
    regsub "\n" $rdet " " rDetails($rid)
#    set rDetails($rid) [ .erd.t.1.e get  0.0 end]
    set rPerm($rid) "---------"
    if { $rpermR0 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 0 0 "z"] }
    if { $rpermR1 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 1 1 ""] }
    if { $rpermR2 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 2 2 "t"] }
    if { $rpermR3 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 3 3 "k"] }
    if { $rpermC0 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 4 4 "z"] }
    if { $rpermC1 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 5 5 ""] }
    if { $rpermC2 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 6 6 "t"] }
    if { $rpermC3 == 1} { set rPerm($rid) [ string replace $rPerm($rid) 7 7 "k"] }
    if { $rpermD  == 1} { set rPerm($rid) [ string replace $rPerm($rid) 8 8 "d"] }

    set win [ .t.nb subwidget rooms ]
    set swin [ $win.w subwidget window]
    clearRoomLine $swin $editRid
    fillRoomLine $swin $editRid
    destroy .erd
}

############################
# Input                    #
############################


proc ReadUsers { } {
    global dataPath
    global idByUser uName uFullName uGroups uMail uSMTP uColor1 uColor2 uDontList uNotify
    

    set curID -1
    set file "$dataPath/users"

    if { ! [file exists $file] } { 
	_ErrorDialog "users file miessing" "There should be an (default) users file in $dataPath.\nAdminko has not been tested without a \nusers file containing at least one user. Continue on own risk\n"
	return
    } else  { 
	if { ! [file readable $file] } { 
	    _ErrorDialog "users file not readable" "The users file must be readable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	if { ! [file writable  $file] } { 
	    _ErrorDialog "users file not readable" "The users file must be writeable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	
    }
    

    set fid [ open $file "r"]
    while { ! [eof $fid] } {
	set line [gets $fid]
 	set tag [ lindex [split [lindex $line 0] = ] 0]
	if { $tag == "ID" } {
	    set curID [ lindex [split [lindex $line 0] = ] 1]
	    set name  [lindex $line 1]
	    set idByUser($name) $curID
	    set uName($curID) $name
	    set uFullName($curID) ""
	    set uGroups($curID) ""
	    set uMail($curID) "- - - -"
	    set uSMTP($curID) "- - - -"
	    set uDontList($curID) 0
	    set uColor1($curID) "#000000"
	    set uColor2($curID) "#000000"
	    set uNotify($curID) ""
	} elseif {$curID>=0 } {
	    if { $tag == "FULL"  } {
		set uFullName($curID) [lrange $line 1 end]
	    } elseif { $tag == "GROUPS"} {
		set uGroups($curID) [lrange $line 1 end]
	    } elseif { $tag == "MAIL"  } {
		set  uMail($curID) [lreplace $uMail($curID) 0 0 [ lindex $line 1] ]
	    } elseif { $tag == "MAIL2" } {
		set  uMail($curID) [lreplace $uMail($curID) 1 1 [ lindex $line 1] ]
	    } elseif { $tag == "MAIL3" } {
		set  uMail($curID) [lreplace $uMail($curID) 2 2 [ lindex $line 1] ]
	    } elseif { $tag == "MAIL4" } {
		set  uMail($curID) [lreplace $uMail($curID) 3 3 [ lindex $line 1] ]
	    } elseif { $tag == "SMTP"  } {
		set  uSMTP($curID) [lreplace $uSMTP($curID) 0 0 [ lindex $line 1] ]
	    } elseif { $tag == "SMTP2" } {
		set  uSMTP($curID) [lreplace $uSMTP($curID) 1 1 [ lindex $line 1] ]
	    } elseif { $tag == "SMTP3" } {
		set  uSMTP($curID) [lreplace $uSMTP($curID) 2 2 [ lindex $line 1] ]
	    } elseif { $tag == "SMTP4" } {
		set  uSMTP($curID) [lreplace $uSMTP($curID) 3 3 [ lindex $line 1] ]
	    } elseif { $tag == "COLOR" } {
		set  uColor1($curID) [ lindex $line 1]
		set  uColor2($curID) [ lindex $line 2]
	    } elseif { $tag == "DONTLIST" } {
		set uDontList($curID) 1
	    } elseif { $tag == "GETNOTIFY4" } {
		set uNotify($curID) [lrange $line 1 end]
	    }
	}
    }
    close $fid    
}
proc ReadGroups { } {
    global dataPath
    global idByGroup gName gAdmin gPerm gColor gDontList
    
    set curID -1
    set file "$dataPath/groups"

    if { ! [file exists $file] } { 
	_ErrorDialog "groups file miessing" "There should be an (default) groups file in $dataPath.\nAdminko has not been tested without a \ngroups file containing at least one group. Continue on own risk\n"
	return
    } else  { 
	if { ! [file readable $file] } { 
	    _ErrorDialog "groups file not readable" "The groups file must be readable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	if { ! [file writable  $file] } { 
	    _ErrorDialog "groups file not readable" "The groups file must be writeable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	
    }



    set fid [ open $file "r"]
    while { ! [eof $fid] } {
	set line [gets $fid]
 	set tag [ lindex [split [lindex $line 0] = ] 0]
	if { $tag == "ID" } {
	    set curID [ lindex [split [lindex $line 0] = ] 1]
	    set name  [lindex $line 1]
	    set idByGroup($name) $curID
	    set gName($curID) $name
	    set gAdmin($curID) ""
	    set gPerm($curID) ""
	    set gColor($curID) "#000000"
	    set gDontList($curID) 0
	} elseif {$curID>=0 } {
	    if { $tag == "ADMIN" } {
		set gAdmin($curID) [lrange $line 1 end ]
	    } elseif { $tag == "PERM"  } {
		set  gPerm($curID) [lrange $line 1 3]
	    } elseif { $tag == "COLOR" } {
		set  gColor($curID) [ lindex $line 1]
	    } elseif { $tag == "DONTLIST" } {
		set gDontList($curID) 1
	    }
	}
    }
    close $fid    
}
proc ReadRooms { } {
    global dataPath
    global idByRoom rName rDetails rPerm
    
    set curID -1
    set file "$dataPath/rooms"


    if { ! [file exists $file] } { 
	_ErrorDialog "rooms file miessing" "There should be an (default) rooms file in $dataPath.\nAdminko has not been tested without a \nrooms file containing at least one room. Continue on own risk\n"
	return
    } else  { 
	if { ! [file readable $file] } { 
	    _ErrorDialog "rooms file not readable" "The rooms file must be readable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	if { ! [file writable  $file] } { 
	    _ErrorDialog "rooms file not readable" "The rooms file must be writeable.\nYou either run adminko with the wrong user\n or didn't grant sufficient permssion on $file\n. Please check this an start again\n"
	    exit
	}
	
    }



    set fid [ open $file "r"]
    while { ! [eof $fid] } {
	set line [gets $fid]
 	set tag [ lindex [split [lindex $line 0] = ] 0]
	if { $tag == "ID" } {
	    set curID [ lindex [split [lindex $line 0] = ] 1]
	    set name  [lrange $line 1 end]
	    set idByRoom($name) $curID
	    set rName($curID) $name
	    set rDetails($curID) ""
	    set rPerm($curID) ""
	} elseif {$curID>=0 } {
	    if { $tag == "DETAILS" } {
		set rDetails($curID) [lrange $line 1 end ]
	    } elseif { $tag == "PERM"  } {
		set  rPerm($curID) [lrange $line 1 3]
	    }
	}
    }
    close $fid    
}

proc readInstall { } {
    global dataPath

    set file "/etc/minkowsky"

    if { ! [file exists $file] } { 
 	_ErrorDialog "configuration file missing" "The main configuration file $file is missing.\nWithout this file neither adminko \nnor the minkowsky will be running. You may either started \nadminko on a host without minkowsky beeing installed\nor have removed this file"
 	exit
    } else  { 
 	if { ! [file readable $file] } { 
 	    _ErrorDialog "configuration file unreadable" "The main configuration file $file is unreadable\n.However adminko (and minkowsky) needs this file to function proper\n. You should make this file public readable\n"
 	    exit
 	}
    }

    set dataPath ""
    set fid [ open $file "r"]
    while { ! [eof $fid] } {
	set line [gets $fid]
	if { [ lindex $line 0] == "TERMIN_DATA_PATH" } {
	    set dataPath [ lindex $line 1]
	}
	if { [ lindex $line 0] == "DATA_PATH" } {
	    set dataPath [ lindex $line 1]
	}
    }
    close $fid

    if { $dataPath == "" } {
	_ErrorDialog "configuration file incomplete" "The main configuration file $file does not contain the\ndata path of the minkowsky server.\nMaybe you started adminko on a host with only a client installation.\nYou MUST start adminko the host running the minkowsky server."
	exit
    }	
}

##########################
# Output                 #
##########################

proc writeUsers { } {
    global dataPath
    global idByUser uName uFullName uGroups uMail uSMTP uDontList uColor1 uColor2 uNotify
    
    set curID -1
    set file "$dataPath/users.new"
    set fid [ open $file "w"]
    foreach uid  [lsort -integer [array names uName] ] {
	puts $fid "ID=$uid $uName($uid)"
	if {$uFullName($uid) != "" } { puts $fid "FULL   $uFullName($uid)"}
	if {$uGroups($uid)   != "" } { puts $fid "GROUPS $uGroups($uid)"}
	if {[ lindex $uMail($uid) 0] != "-" } { puts $fid [format "MAIL   %s" [ lindex $uMail($uid) 0 ] ] }
	if {[ lindex $uSMTP($uid) 0] != "-" } { puts $fid [format "SMTP   %s" [ lindex $uSMTP($uid) 0 ] ] }
	for {set i 1} {$i <4} {incr i} {
	    set j [expr $i +1]
	    if {[ lindex $uMail($uid) $i] != "-" } { puts $fid [format "MAIL$j  %s" [ lindex $uMail($uid) $i ] ] }
	    if {[ lindex $uSMTP($uid) $i] != "-" } { puts $fid [format "SMTP$j  %s" [ lindex $uSMTP($uid) $i ] ] }
	}
	if { $uColor1($uid) !=  ""} { 
	    if { $uColor2($uid) ==  ""} { set $uColor2($uid) "#000000" }
	    puts $fid "COLOR $uColor1($uid) $uColor2($uid)" 
	}
	if { $uNotify($uid) !=  ""} { puts $fid "GETNOTIFY4 $uNotify($uid)" }
	if { $uDontList($uid) ==  1} { puts $fid "DONTLIST" }
	puts $fid ""
    }
    close $fid    
}
proc writeGroups { } {
    global dataPath
    global idByGroup gName gAdmin gPerm gDontList gColor
    
    set curID -1
    set file "$dataPath/groups.new"
    set fid [ open $file "w"]
    foreach gid  [lsort  -integer [array names gName] ] {
	puts $fid "ID=$gid $gName($gid)"
	if {$gAdmin($gid) != "" } { puts $fid "ADMIN  $gAdmin($gid)"}
	if {$gPerm($gid)  != "" } { puts $fid "PERM   $gPerm($gid)"}
	if { $gColor($gid) !=  ""} { puts $fid "COLOR $gColor($gid)" }
	if { $gDontList($gid) ==  1} { puts $fid "DONTLIST" }
	puts $fid ""
    }
    close $fid    
}
proc writeRoom { } {
    global dataPath
    global idByRoom rName rDetails rPerm
    
    set curID -1
    set file "$dataPath/rooms.new"
    set fid [ open $file "w"]
    foreach rid  [lsort  -integer [array names rName] ] {
	puts $fid "ID=$rid $rName($rid)"
	if {$rDetails($rid) != "" } { puts $fid "DETAILS $rDetails($rid)"}
	if {$rPerm($rid)    != "" } { puts $fid "PERM    $rPerm($rid)"}
	puts $fid ""
    }
    close $fid    
}




proc saveChanges { } {
    global dataPath
    writeUsers
    writeGroups
    writeRoom
    set file "$dataPath/users"
    set tfile "$dataPath/users.new"
    file rename  -force $tfile $file
    set file "$dataPath/groups"
    set tfile "$dataPath/groups.new"
    file rename  -force $tfile $file
    set file "$dataPath/rooms"
    set tfile "$dataPath/rooms.new"
    file rename  -force $tfile $file
}
proc activateChanges { } {
    global bfnt14  activateEnabled
    set fid [open "/var/run/minkowsky.pid" "r"]
    set mpid [gets $fid]
    set err [catch {exec kill -SIGUSR1 $mpid}]
    if { $err != 0} {
	toplevel .msg
	frame .msg.t -relief raised -bd 1
	frame .msg.b
	pack .msg.t .msg.b -side top
	message .msg.t.m -text "Activation of Changes in the Minkowsky-Server failed.\n Please restart the Minkowsky-Server manually or \nsend a SIGUSR1-Signal to the Minkowsky-Server in order to activate the changes on the users-database" -width 400 -font $bfnt14
	pack .msg.t.m  -side top
	button .msg.b.c -text "Close" -command {destroy .msg}
	pack  .msg.b.c -side right
	wm title .msg "Alert"
	centerWin .msg 400 108
	update
	tkwait window .msg
    }
}

proc _ErrorDialog { title msg } {
    global fnt bfnt bfnt18
    if { [winfo exists .err ] == 1 } { return }
    toplevel .err 
    
    frame .err.t -relief raised -bd 1
    frame .err.b -relief flat
    pack .err.t -side top -fill x
    pack .err.b -side bottom -fill x -pady 4

    set list [split $msg \n]
    set count [llength $list]
    set lt [lindex [lsort -decreasing -command compBySize $list  ] 0 ]
    set w [expr [font measure $bfnt18 -displayof .err $lt] ] 

    label .err.t.lab -text $title -font $bfnt18 -fg red -relief raised -bd 1 -anchor n -justify center
    message .err.t.msg -text $msg -font $bfnt18 -width $w
    button .err.b.but -text " OK " -command {closeWin .err} -font $bfnt
    pack .err.t.lab -side top -fill x
    pack .err.t.msg -side top -expand 1 -fill x
    pack .err.b.but -side bottom -pady 3
    set h [expr $count*24 +24+48+8]
    set lt [lindex [lsort -decreasing -command compBySize $list  ] 0 ]
    incr w 16
    wm title .err $title
    centerWin .err $w $h
    grab .err
    bind .err <Return> {closeWin .err}
    bind .err <KP_Enter> {closeWin .err}
    update
}

proc centerWin { win w h } {
    set masterGeo [ split [ wm geometry .] x+ ]
    set mdx [lindex $masterGeo 0 ]
    set mdy [lindex $masterGeo 1 ]
    set mx [lindex $masterGeo 2 ]
    set my [lindex $masterGeo 3 ]

    set x [expr $mx + $mdx/2 -$w/2 ]
    set y [expr $my + $mdy/2 -$h/2 ]

    set geo [format "%dx%d+%d+%d" $w $h  $x $y ]
    wm geometry $win $geo
    wm transient $win .
}

set fnt10 -*-helvetica-medium-r-normal-*-10-*-*-*-*-*-*-*
set bfnt10 -*-helvetica-bold-r-normal-*-10-*-*-*-*-*-*-*
set fnt -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*
set bfnt -*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*
set pfnt -*-lucidatypewriter-medium-*-normal-*-12-*-*-*-*-*-*-*
set pbfnt -*-lucidatypewriter-bold-*-normal-*-12-*-*-*-*-*-*-*
set fnt14 -*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*
set bfnt14 -*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*
set fnt18 -*-helvetica-medium-r-normal-*-18-*-*-*-*-*-*-*
set bfnt18 -*-helvetica-bold-r-normal-*-18-*-*-*-*-*-*-*

#FIXE  activateEnabled == 1 if Server understands USR1-signal again
#set activateEnabled 1
set activateEnabled 0

readInstall
ReadUsers
ReadGroups
ReadRooms

frame .t 
frame .b 

pack .t .b -side top -fill x


tixNoteBook .t.nb -ipadx 2 -ipady 2
.t.nb add users  -label " Users " -underline -1   -state disabled
.t.nb add groups -label " Groups " -underline -1   -state disabled
.t.nb add rooms  -label " Rooms " -underline -1   -state disabled
.t.nb add templ  -label " Templates " -underline -1  -state disabled
.t.nb add freien -label " Holidays " -underline -1 -state disabled

pack .t.nb -side top

button .b.can -text " Cancel " -command exit
checkbutton .b.c -text "Activate Changes on Exit" -variable activateEnabled  -state disabled
button  .b.sav -text "  Save  " -command saveChanges
button  .b.exit -text " Save & Exit " -command {
    saveChanges
    #FIXME comment in activateChanges if server understands signal USR1 again
#    activateChanges
    exit
}

pack .b.can -side left
pack .b.exit -side right 
pack .b.sav -side right -padx 12
pack .b.c -side right 


wm title . "AdMinKo: Minkowsky Administration"
drawUsersTab [ .t.nb subwidget users ]
update
 .t.nb pageconfigure users  -state normal
update
drawGroupsTab [ .t.nb subwidget groups ]
update
 .t.nb pageconfigure groups  -state normal
update
drawRoomsTab [ .t.nb subwidget rooms ]
update
 .t.nb pageconfigure rooms  -state normal
update
