#!/usr/bin/ruby
# encoding: utf-8

require 'gtk2'
require 'vte'
require "rexml/document"
require 'optparse'
require 'InfoScreen'
require 'SambaScreen'
require 'WindowsScreen'
require 'PhotorecScreen'
# require 'MobilerecScreen'
require 'RescueScreen'
require 'VirusScreen'
require 'ChntpwScreen'
require 'DeleteScreen'
require 'CloneScreen'
require 'TileHelpers'
require 'NetworkScreen' 
require 'CheckScreen'
require 'UsbInstallScreen'
require 'DvdRescueScreen' 
require 'ImageScreen'
require 'MfsSinglePartition.rb'
require 'MfsDiskDrive.rb'
require 'MfsTranslator.rb'

@simulate = Array.new
@deco = true
@start = nil
@forcescreen = false
opts = OptionParser.new 
opts.on('-s', '--simulate', :REQUIRED ) { |i| i.split(",").each { |j| @simulate.push(j) } }
opts.on('--no-deco') { @deco = false } 
opts.on('--start', :REQUIRED ) { |i| 
	@start = i.strip 
	@forcescreen = true
} 
opts.parse!

TileHelpers.umount_all

window = Gtk::Window.new
window.border_width = 10
window.window_position = Gtk::Window::POS_CENTER_ALWAYS

if @deco == false
	window.deletable = false
	window.decorated = false
	window.allow_grow = false
	window.allow_shrink = false
end

window.title = "Notfall-DVD 5.0"
window.signal_connect('delete_event') { false }
window.signal_connect('destroy') { 
	system("rm /var/run/lesslinux/assistant_running")
	Gtk.main_quit
}

# Layout table

table = Gtk::Table.new(3,    6,    false)
table.row_spacings = 10
table.column_spacings = 10

button = Array.new
button[0] = Gtk::EventBox.new.add Gtk::Image.new("reparieren.png")
button[1] = Gtk::EventBox.new.add Gtk::Image.new("viren.png")
button[2] = Gtk::EventBox.new.add Gtk::Image.new("deletelightgreen.png") # erase.png
button[3] = Gtk::EventBox.new.add Gtk::Image.new("password120.png") # password
button[4] = Gtk::EventBox.new.add Gtk::Image.new("recover.png")
button[5] = Gtk::EventBox.new.add Gtk::Image.new("mobilerec.png") # photorec
button[6] = Gtk::EventBox.new.add Gtk::Image.new("samba.png")
button[7] = Gtk::EventBox.new.add Gtk::Image.new("rescue.png")
button[8] = Gtk::EventBox.new.add Gtk::Image.new("shutdown.png")
button[9] = Gtk::EventBox.new.add Gtk::Image.new("desktop.png")
button[10] = Gtk::EventBox.new.add Gtk::Image.new("info.png")
button[11] = Gtk::EventBox.new.add Gtk::Image.new("usbinstall.png")
button[12] = Gtk::EventBox.new.add Gtk::Image.new("dvdrescue.png")

desctexts = [ 
"Stürzt Windows häufig ab oder startet der PC nur noch mit einer Fehlermeldung? Für solche Fälle gibt es viele mögliche Ursachen. Solange es nicht an einer defekten Hardware liegt, kann das Problem meist von der Notfall-DVD behoben werden. Wählen Sie dazu diese Option, und folgen Sie den weiteren Anweisungen.", 
"Merkwürdige PC-Ausfälle, langsames Arbeitstempo und eine scheinbar grundlos arbeitende Festplatte können auf eine Viren-Infektion hindeuten. Mit dieser Funktion überprüfen Sie den Computer auf Schadsoftware und löschen die Übeltäter. Das klappt sogar bei Viren, die unter Windows nicht entdeckt oder entfernt werden können.",
"Möchten Sie Ihren Computer verkaufen, Ihre alte Festplatte oder einen USB-Stick entsorgen? Dann sollten Sie sicherstellen, dass niemand an Ihre persönlichen Dateien kommt. Ein Klick auf diesen Eintrag startet den Datenschredder der Notfall-DVD, der den Inhalt beliebiger Laufwerke unwiederbringlich löscht.", 
"Sie haben Ihr Windows-Kennwort vergessen und sind vom PC ausgesperrt? Mit diesem Notfall-Werkzeug können Sie das Zugangspasswort zurücksetzen und sich wieder am Betriebssystem anmelden. Achtung: Ihr Windows-Konto ist danach ungeschützt. Vergessen Sie daher nicht, ein neues Kennwort unter Windows festzulegen. ",
"Haben Sie versehentlich wichtige Dateien von der Festplatte gelöscht und den Windows-Papierkorb geleert? Dann wählen Sie diese Rettungs-Funktion. Damit stellen Sie beliebige Dateien wieder her, solange deren Speicherbereich auf dem Laufwerk nicht anderweitig überschrieben wurde.", 
"Wurden versehentlich oder durch einen Geräte-Fehler Bilder von einer Kamera oder einem Mobiltelefon gelöscht, hilft in vielen Fällen dieses Werkzeug. Schließen Sie das Gerät per USB-Kabel an oder legen Sie dessen Speicherkarte ins Lesegerät des Computers. Danach können Sie alle Bilder inklusive gelöschter Dateien auf ein anderes Laufwerk kopieren.", 
"Sie möchten die Daten auf diesem PC sichern, haben aber keine externe Festplatte frei? Falls Sie ein Heimnetzwerk besitzen, können Sie die Laufwerke dieses Computers freigeben und von einem anderen PC darauf zugreifen. So lassen sich Dateien direkt auf dem zweiten Computer sichern.",
"Wenn Windows nicht mehr startet, kommen Sie auch nicht mehr an Ihre Dokumente, Fotos, Video- und Musikdateien. Kein Problem mit der Notfall-DVD. Per Klick auf diesen Eintrag können Sie eine Komplett-Sicherung erstellen und später zurückspielen. Zudem lassen sich hier einzelne Dateien auf USB-Laufwerken oder einer Online-Festplatte wie Dropbox und SkyDrive sichern.", 
"Diese Schaltfläche fährt den Computer herunter und öffnet das CD/DVD-Laufwerk. Um Windows zu starten, nehmen Sie die Notfall-DVD aus dem Laufwerk und schalten den Computer wieder ein. ", 
"Weitere Rettungsprogramme sowie einen kompletten Notfall-Arbeitsplatz finden Sie in dieser erweiterten Oberfläche. Damit können Sie zum Beispiel ohne Windows im Internet surfen, E-Mails schreiben und Dateien bearbeiten. ", 
"Hier erfahren Sie mehr über die Notfall-DVD 5.0.",
"Mit dieser Funktion können Sie die Notfall-DVD direkt auf einen USB-Stick überspielen. Dort bleiben zum Beispiel Aktualisierungen des Virenscanners, Ihre persönlichen WLAN-Einstellungen und Internet-Downloads erhalten, und Sie haben die Rettungs-Software immer am Schlüsselbund dabei.",
"Kratzer, Staub und Sonnenlicht setzen vor allem selbst gebrannten CDs oder DVDs zu. Mit zunehmendem Alter hagelt es dann oftmals Lesefehler, und auf der Silberscheibe gesicherte Dateien sind nicht mehr lesbar. Mit dieser Funktion retten Sie Daten von beschädigten Daten-CDs und DVDs." ]
descriptions = Hash.new
infolabel = Gtk::Label.new
infolabel.set_markup("<span color='white'>Sobald Sie mit der Maus auf eine Funktion zeigen, erhalten Sie weitere Informationen dazu.</span>")
infolabel.wrap = true
infolabel.width_request = 500

button.each { |b| b.set_size_request(120, 120) }
[ 0, 1, 4, 5 ].each { |n|
	button[n].set_size_request(250, 120)
}
# [ 2, 3, 6, 7, 8, 9, 10, 11, 12 ].each { |n|
#	button[n].set_size_request(120, 120)
# }


0.upto(12) { |n|
	descriptions[button[n]] = desctexts[n]
	button[n].signal_connect('enter-notify-event') { |x, y|
		# puts "Entered: " + descriptions[x]
		infolabel.set_markup("<span color='white'>" + descriptions[x] + "</span>")
	}
	button[n].signal_connect('button-release-event') { |x, y|
		if y.button == 1 
			# puts "Clicked: " + descriptions[x]
		elsif y.button == 2 && x == button[10]
			puts "Middle clicked info"
			system("/usr/bin/Terminal --hide-menubar -e '/usr/bin/nInvaders -l 3' &") 
			# system("/usr/bin/xfce4-terminal --hide-menubar -e /usr/bin/nInvaders &")
		elsif y.button == 3 && x == button[10]
			system("wicd-gtk -n &") 
		end
	}
}

options = Gtk::FILL|Gtk::EXPAND|Gtk::SHRINK
table.attach(button[0],  0,  1,  0,  1, options, options, 0,    0)
table.attach(button[4],  1,  3,  0,  1, options, options, 0,    0)
table.attach(button[5],  3,  5,  0,  1, options, options, 0,    0)
table.attach(button[7],  5,  6,  0,  1, options, options, 0,    0)

table.attach(button[1],  0,  1,  1,  2, options, options, 0,    0)
table.attach(button[3],  1,  2,  1,  2, options, options, 0,    0)
table.attach(button[12],  2,  3,  1,  2, options, options, 0,    0)
table.attach(button[2],  3,  4,  1,  2, options, options, 0,    0)
table.attach(button[6],  4,  5,  1,  2, options, options, 0,    0)
table.attach(button[11],  5,  6,  1,  2, options, options, 0,    0)

table.attach(infolabel,  0,  3,  2,  3, options, options, 0,    0)
table.attach(button[10], 3,  4,  2,  3, options, options, 0,    0)
table.attach(button[9],  4,  5,  2,  3, options, options, 0,    0)
table.attach(button[8],  5,  6,  2,  3, options, options, 0,    0)

table.width_request = 900 

window.set_size_request(972, 548)
window.border_width = 0

bgimg = Gtk::Image.new("bg_notfall-50.png")

fixed = Gtk::Fixed.new
fixed.put(bgimg, 0, 0)
fixed.put(table, 35, 136)

#
# Now create some objects for each task - return windows as "named layers"
# 

layers = Hash.new
layers["start"] = table

# Network screen
networkscreen = NetworkScreen.new(layers)
networkscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now the Samba share
sambascreen = SambaScreen.new(layers, button[6], networkscreen)
sambascreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now fix windows
winfixscreen = WindowsScreen.new(layers, button[0])
winfixscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now Photorec
photorecscreen = PhotorecScreen.new(layers, [ button[4], button[5] ] )
photorecscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now Photorec
# mobilerecscreen = MobilerecScreen.new(layers, button[5])
# mobilerecscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now Rescue
rescuescreen = RescueScreen.new(layers, button[7], networkscreen)
rescuescreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now virus screen
virusscreen = VirusScreen.new(layers, button[1], networkscreen)
virusscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Check screen (bad memory, hibernation, Intel IMSM)
checkscreen = CheckScreen.new(layers, @simulate)
checkscreen.layers.each { |k| fixed.put(k, 35, 136) }

# The simple info screen
infoscreen = InfoScreen.new(layers, button[10], networkscreen, virusscreen.scanner, checkscreen.show)
infoscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Now chntpw screen
chntpwscreen = ChntpwScreen.new(layers, button[3] )
chntpwscreen.layers.each { |k| fixed.put(k, 35, 136) }

# Delete screen
deletescreen = DeleteScreen.new(layers, button[2] )
deletescreen.layers.each { |k| fixed.put(k, 35, 136) }

# Clone screen
clonescreen = CloneScreen.new(layers)
clonescreen.layers.each { |k| fixed.put(k, 35, 136) }

# Image screen
imagescreen = ImageScreen.new(layers)
imagescreen.layers.each { |k| fixed.put(k, 35, 136) }

# USB installation
usbscreen = UsbInstallScreen.new(layers, button[11])
usbscreen.layers.each { |k| fixed.put(k, 35, 136) }

# DVD rescue screen
dvdscreen = DvdRescueScreen.new(layers, button[12], photorecscreen)
dvdscreen.layers.each { |k| fixed.put(k, 35, 136) }

# No separate layer for desktop mode
button[9].signal_connect('button-release-event') {
	system("touch /home/surfer/.ll_requested_desktop")
	system("chown 1000:1000 /home/surfer/.ll_requested_desktop")
	Gtk.main_quit 
}

# No separate layer for shutdown
button[8].signal_connect('button-release-event') {
	# system("touch /var/run/lesslinux/requested_shutdown")
	system("/usr/bin/shutdown-wrapper.sh") 
}

layers.keys.sort.each { |n|
	puts "Layer: " + n 
}

#
# Show everything
#

window.add fixed
window.show_all 
layers.each { |k,v| v.hide_all }

@start = "start" if @start.nil?

if File.exist?("/var/run/lesslinux/license_accepted") &&  checkscreen.show == true
	layers["checkscreen"].show_all 
elsif File.exist?("/var/run/lesslinux/license_accepted") || @forcescreen == true
	layers[@start].show_all 
else
	layers["legal"].show_all 
end

# networkscreen.network_dialog

Gtk.main
