#!/usr/bin/perl
# (C) Tomas Bazant, Cesky rozhlas, 2006

use Data::Dumper;
use Gtk2 '-init';
use Gtk2::GladeXML;
use strict;
use constant true => 1;
use constant false => 0;
use Dvd2avi::Functions;

# globalni promenne: '%widget' obsahje vsechny widgety a '%params' vsechny udaje pro samotne enkodovani
use vars qw($main_window_xml $progress_window_xml %widgets %params @titles @f_titles @chapters @audios @hideitems @cdsize @cdlabel @mp3_methods);

# M A I N   W I N D O W
$main_window_xml = Gtk2::GladeXML->new('/usr/share/dvd2avi/dvd2avi.glade','main_window');
$main_window_xml->signal_autoconnect('connect_callback');

# seznam pouzitych widgetu
my @items = qw(main_window input_entry title_frame audio_frame title_combo audio_combo  chapter_all_radio chapter_single_radio mp3_bitrate mp3_method auto_crop_btn crop_entry crop_checkbutton audio_mp3_radio crop_frame bitrate_frame vcodec_frame btr_cd_combo fit_to_cd_radio vbitrate_radio vbitrate_entry hq save_avi_entry deint nr cartoon save_avi_hbox run_hbox preview_button save_script_btn run_btn chapter_combo replay_gain min_scaled_width_spin statusbar min_tit_len_chkbtn min_title_len_spin);
# vytvor widgety
%widgets = &get_widgets(@items); &print_status("Graphical widgets initialized");

&init_widgets; # nastav widgety

# seznam widgetu k znecitliveni
@hideitems = qw(crop_frame bitrate_frame vcodec_frame title_frame audio_frame chapter_all_radio auto_crop_btn crop_entry vbitrate_entry save_avi_hbox preview_button save_script_btn run_btn);
# znecitliv je
&sense(@hideitems,0);

# main loop
Gtk2->main;

###################
### F U N K C E ###
###################

sub print_status { # fill status line with $message
	if($params{'title'}) {
		my $message = shift;
		my $id = $widgets{'statusbar'}->get_context_id("0");
		$widgets{'statusbar'}->push($id,$message);
	}
}

sub init_widgets { # pocatecni hodnoty widgetu
	$widgets{'min_tit_len_chkbtn'}->set_active(1);
	$widgets{'hq'}->set_active(1); # zapneme HQ video volby
	$widgets{'audio_mp3_radio'}->set_active(1); $params{'oac'} = "mp3lame"; # nastav MP3
	$widgets{'mp3_bitrate'}->set_value(128); # nastav 128 kbps audio bitrejt
	$widgets{'replay_gain'}->set_value(8); # nastav 8 dB zesileni zvuku
	$widgets{'mp3_method'}->set_active(0); # nastav cbr
	&get_cd_combo_ready; # napln kombo pro CD velikosti
	&get_mp3_method_combo_ready; # napln kombo pro metodu MP3 komprese
}

sub get_widgets { # prirad vsechny widgety ze XML hlavniho okna
	my @items = @_;
	my %arr;
	foreach(@items) {
		$arr{"$_"} = $main_window_xml->get_widget("$_");
	}
	return %arr;
}

sub connect_callback { # pripoj signaly hlavniho okna
	my($name,$widgets,$signal,$signal_data,$connect,$after,$userdata) = @_;
	$widgets->signal_connect($signal,$name);
}

sub sense { # nastav ne/citlivost $val widgetum v poli
	my @items = @_;
	my $val = pop(@items);
	foreach(@items) {
		#print $_."\n";
		$widgets{"$_"}->set_sensitive($val);
	}
}

sub get_title_combo_ready {
	my @titles = @_;
	@f_titles = (); # reset the title conversion arr
	my $model = Gtk2::ListStore->new('Glib::String');
	for(my $i = 1; $i < @titles; $i++) {
		my $min_tit_len = $params{'min_tit_len'};
		my $tit_len_min = &functions::hrs2min($titles[$i]);
		my $tit_len_sec = &functions::hrs2sec($titles[$i]);
		if($min_tit_len) {
			if($tit_len_min >= $min_tit_len) {
				push @f_titles,$i;
				$model->set($model->append,0,"Title ".$i." - ".$titles[$i]." sec")
			}
		} elsif ($tit_len_sec > 0) {
			push @f_titles,$i;
			$model->set($model->append,0,"Title ".$i." - ".$titles[$i]." sec")
		}
	}
	$widgets{'title_combo'}->set_model($model);
	# let's choose the longest title
	if($titles[0]) {
		for(my $i = 0; $i < @f_titles; $i++) {
			if($f_titles[$i] == $titles[0]) {
				$widgets{'title_combo'}->set_active($i);
			}
		}
	}
	
	
}

sub get_audio_combo_ready { # dej dohromady kombobox pro audiostopy
	my @audios = @_;
	my $i = 0;
	my $model = Gtk2::ListStore->new('Glib::String');
	for($i = 1; $i < @audios; $i++) {
		$model->set($model->append,0,$i." - ".$audios[$i])
	}
	$widgets{'audio_combo'}->set_model($model);
	$widgets{'audio_combo'}->set_active($audios[0] - 1); # jako predvolenou nastav ceskou aidiostopu
}

sub get_chapter_combo_ready { # dej dohromady kombobox pro vyber kapitol
	my @chapters = @_;
	my $i = 0;
	my $model = Gtk2::ListStore->new('Glib::String');
	for($i = 1; $i < @chapters; $i++) {
		$model->set($model->append,0,"no. ".$i." - ".$chapters[$i])
	}
	$widgets{'chapter_combo'}->set_model($model);	
}

sub get_cd_combo_ready { # dej dohromady kombo pro velikosti CD
	@cdsize = qw(704 1408 352); # velikosti v MB
	@cdlabel = ("1 CD \(704 MB\)","2 CD \(1408 MB\)","1/2 CD \(352 MB\)"); # ...trosku citelnejsi pro uzivatele
	my $model = Gtk2::ListStore->new('Glib::String');
	foreach(@cdlabel) {
		$model->set($model->append,0,$_);
	}
	$widgets{'btr_cd_combo'}->set_model($model);
	$widgets{'btr_cd_combo'}->set_active(0);
}

sub get_mp3_method_combo_ready {
	@mp3_methods = qw(cbr abr); # konstantni nebo variabilni btr
	my $model = Gtk2::ListStore->new('Glib::String');
	foreach(@mp3_methods) {
		$model->set($model->append,0,$_);
	}
	$widgets{'mp3_method'}->set_model($model);
	$widgets{'mp3_method'}->set_active(0);
}

sub update_vbitrate { # zaktualizuj okenko s bitratem
	my($a,$b,$c) = ($params{'mp3_bitrate'},$params{'cd_size'},$params{'length'});
	$params{'vbitrate'} = &functions::get_vbitrate($a,$b,$c);
	$widgets{'vbitrate_entry'}->set_text($params{'vbitrate'});
	&print_status("Video bitrate updated");
}

sub get_run_cmd { # sestav prikazovou radku pro mencoder
	my $pass 	= shift;
	my $nice 	= "+10";
	my $aid		= &get_aid;
	my $oac		= &get_oac($pass);
	my $oacopts	= &get_oacopts($pass);
	my $af		= &get_af;
	my $vf		= &get_vf;
	my $ovc		= &get_ovc;
	my $ovcopts	= &get_ovcopts($pass);
	my $output_file	= &get_output_file($pass);
	my $input_file	= &get_input_file;
	my $otheropts	= &get_otheropts;
	my $chapter	= &get_chapter;
	my $cmd;
	if($nice) {
		$cmd .= "nice -n $nice \\\n";
	}
	$cmd .= "mencoder $input_file \\\n";
	$cmd .= "-aid $aid \\\n";
	if($chapter){
		$cmd .= "$chapter \\\n";
	}
	$cmd .= "-oac $oac \\\n";
	if($oacopts) {
		$cmd .= "$oacopts \\\n";
	}
	if($af) {
		$cmd .= "$af \\\n";
	}
	$cmd .=	"-ovc $ovc \\\n";
	if($ovcopts) {
		$cmd .= "$ovcopts \\\n";
	}
	if($vf) {
		$cmd .= "$vf \\\n";
	}
	if($otheropts) {
		$cmd .= "$otheropts \\\n";
	}
	$cmd .= "-o $output_file";

	return $cmd;
}

sub get_preview_cmd { # sestav prikazovou radku pro oba preview
	my $nice 	= "+10";
	my $aid		= &get_aid;
	my $af		= &get_af;
	my $vf		= &get_vf;
	my $input_file	= &get_input_file;
	my $chapter	= &get_chapter;
	my $cmd;
	if($nice) {
		$cmd .= "nice -n $nice \\\n";
	}
	$cmd .= "mplayer $input_file \\\n";
	$cmd .= "-aid $aid \\\n";
	if($chapter){
		$cmd .= "$chapter \\\n";
	}
	if($af) {
		$cmd .= "$af \\\n";
	}
	if($vf) {
		$cmd .= "$vf \\\n";
	}
	return $cmd;
}

sub get_crop_cmd { # sestav prikazovou radku pro oba preview
	my $pass 	= shift;
	my $nice 	= "+10";
	my $aid		= &get_aid;
	my $vf		= "-vf cropdetect";
	my $input_file	= &get_input_file;
	my $chapter	= &get_chapter;
	my $cmd;
	if($nice) {
		$cmd .= "nice -n $nice \\\n";
	}
	$cmd .= "mplayer $input_file \\\n";
	$cmd .= "-aid $aid \\\n";
	if($chapter){
		$cmd .= "$chapter \\\n";
	}
	if($vf) {
		$cmd .= "$vf \\\n";
	}
	return $cmd;
}


sub get_aid {
	my $aid = $params{'audio'} + 127;
	return $aid;
}

sub get_chapter { # kapitolka nebo cely film ?
	my $chapter;
	if($params{'chapter'}) {
		$chapter = "-chapter ".$params{'chapter'}."-".$params{'chapter'};
	} else {
		$chapter = false;
	}
	return $chapter;
}

sub get_scale { # vypocitej sirku pro zmenseni podle pomeru, bpp, fps; jestli je mensi nez 640, dej 640
	my $bpp = 0.15;
	my $ar = 1.78;
	my $width = sqrt(((1000 / $bpp) * $params{'vbitrate'} * $ar) / $params{'fps'});
	$width = int($width / 16) * 16;
	if($params{'crop_width'} && $width > $params{'crop_width'}) {
		$width = $params{'crop_width'};
	}
	if($width < $params{'min_scaled_width'}) {
		$width = $params{'min_scaled_width'};
	}
	my $scale = "scale=$width:-10";
	return $scale;
}

sub get_vf { # poskladej filty pro video (prokladani, orazani, zmenseni)
	my @vf;
	if($params{'crop'}) { # orezeani
		my $crop = "crop=".$params{'crop'};
		push(@vf,$crop);
	}
	if($params{'deint'}) { # prokladani
		push(@vf,"lavcdeint");
	}

	my $scale = &get_scale; # zmenseni
	push(@vf,$scale);
	my $vf = "-vf ".join(",", @vf); # vytvor seznam oddeleny carkami
	return $vf;
}

sub get_af { # dej dohromady audiofiltry (zatim zadne)
	my $af = false;
	return $af;
}

sub get_input_file { # vstupni soubor/adresar
	my $input_file = "-dvd-device ".$params{'input_path'}." dvd://".$params{'title'};
	return $input_file;
}

sub get_ovcopts { # volby pro videokodek
	my $pass = shift;
	my $ovcopts;
	my $common = "-lavcopts vcodec=mpeg4:autoaspect:mbd=2:turbo:precmp=0";
	if($params{'nr'}) { # noise reduction
		$common .= ":nr=300";
	}
	if($params{'hq'}) { # high quality
		if($params{'cartoon'}) { # nastaveni pro kreslene filmy
			$common .= ":cmp=2:subcmp=2";
		} else {
			$common .= ":cmp=3:subcmp=3";
		}
		$common .= ":trell:v4mv";
	}
	if($pass == 1) {
		$ovcopts = $common.":vpass=1";
	} elsif($pass == 2) {
		$ovcopts = $common.":vpass=2:vbitrate=".$params{'vbitrate'};
	}
	return $ovcopts;
}

sub get_oacopts { # volby pro audio kodek
	my $pass = shift;
	my $oacopts;
	if($pass == 1) {
		$oacopts = false;
	} elsif($pass == 2) {
		if($params{'oac'} eq "copy") {
			$oacopts = false;
		} elsif($params{'oac'} eq "mp3lame") {
			$oacopts = "-lameopts ".$params{'mp3_method'}.":br=".$params{'mp3_bitrate'}.":vol=".$params{'replay_gain'};
		}
	}
	return $oacopts;
}

sub get_output_file { # vystup enkodovani
	my $pass = shift;
	my $output_file;
	if($pass == 1) {
		$output_file = "/dev/null";
	} elsif($pass == 2) {
		$output_file = $params{'save_avi_file'};
	}
}

sub get_otheropts { # ostatni volby
	my $otheropts = "-ffourcc DIVX -mc 0 -passlogfile ".$params{'save_avi_file'}.".pass1log";
	return $otheropts;
}

sub get_ovc { # video kodek
	my $ovc = "lavc";
	return $ovc;
}

sub get_oac { # audio kodek
	my $pass = shift;
	my $oac;
	if($pass == 1) {
		$oac = "copy";
	} elsif($pass == 2) {
		if($params{'oac'} eq "mp3lame") {
			$oac = "mp3lame";
		} elsif($params{'oac'} eq "copy") {
			$oac = "copy";
		} else {
			$oac = false;
		}
	}
	return $oac;
}

sub run_cmd { # proved prikaz a zobraz prubeh a vepis do tajtlu procenta
	my($cmd,$pass) = @_;
	my $fr = 0;
	my $old_fr = 0;
	my $new_fr = 0.001;
	$widgets{'progressbar'}->set_fraction($fr);
	$widgets{'progressbar'}->set_text("Done: 0 %");
	if(my $pid = open(RUN, "$cmd 2>&1 |")) {
		$/ = "\r";
		while(<RUN>) {
			# Pos:  31.8s    796f ( 0%) 28.60fps Trem: 160min 891mb  A-V:0.000 [675:0]
			if(/(\d+)\%.+(\d{2,})\.\d{2}fps.+Trem:\s+(\d+)min/ && ($new_fr > $old_fr)) {
				$fr = ($1/100);
				if($fr > $new_fr) {
					$old_fr = $new_fr;
					$new_fr = $fr;
					$widgets{'progressbar'}->set_text("Done: $1 %, Rate: $2 fps, Remain: $3 min");
					$widgets{'progressbar'}->set_fraction($fr);
					$widgets{'progress_window'}->set_title($1."% of pass ".$pass);
				}
			}
			while(Gtk2->events_pending) { Gtk2->main_iteration } ;
		}
		close(RUN);
	}
}

sub save_script { # dej dohromady prikazovou radku a uloz ji do souboru
	my($pass,$cmd);
	my @pass = qw(1 2);
	$cmd .= "#!/bin/bash \n";
	$cmd .= "# dvd2avi, (C) 2006, Tomas Bazant, Czech Radio Online, http://www.rozhlas.cz \n\n";
	foreach $pass (@pass) {
		$cmd .= "# BEGINNING OF PASS $pass \n\n";
		$cmd .= &get_run_cmd($pass);
		$cmd .= "\n\n# END OF PASS $pass \n\n";
	}
	$cmd .= "\n\n# that's all Dude ! \n";
	$cmd .= "exit 0";
	&functions::str2file($cmd,$params{'save_script_file'});
}

##########################################
#########  K  O  L  B  E  K  Y  ##########
##########################################

sub on_main_window_delete_event { # ukonci gtk loop
	Gtk2->main_quit;
}

sub on_input_button_clicked { # otevri DVD filechooser
	my $open_folder_filechooser_xml = Gtk2::GladeXML->new('/usr/share/dvd2avi/dvd2avi.glade','open_folder_filechooser');
	$open_folder_filechooser_xml->signal_autoconnect('connect_callback');
	$widgets{'open_folder_filechooser'} = $open_folder_filechooser_xml->get_widget('open_folder_filechooser');
	$widgets{'open_folder_filechooser'}->run;
}
sub on_open_folder_filechooser_cancel_button_clicked { # zavri ho pri cancel
	$widgets{'open_folder_filechooser'}->destroy;
}
sub on_open_folder_filechooser_delete_event { # ...anebo kdyz zmacknu krizek
	$widgets{'open_folder_filechooser'}->destroy;
}

sub on_open_folder_filechooser_open_button_clicked { # pri otevreni adresare spust testy a uloz cestu
	$params{'input_path'} = &functions::slash($widgets{'open_folder_filechooser'}->get_filename); # uloz cestu z filechooseru
	$widgets{'open_folder_filechooser'}->destroy; # znic filechooser
	my $ok = &functions::is_dvd($params{'input_path'}); # je to DVD adrsar?
	if($ok) {
		$widgets{'input_entry'}->set_text($params{'input_path'}); # je: zapis cestu do okna
		&sense(qw(title_frame crop_frame bitrate_frame vcodec_frame save_avi_hbox preview_button),1); # odkryj widgety
		@titles = &functions::get_titles($params{'input_path'}); # ziskej informace o titulech
		&get_title_combo_ready(@titles); # priprav kombo pro tituly
		&print_status("DVD succesfully opened...");
	} else {
		&sense(@hideitems,0); # zmraz nepouzitelne widgety
		&print_status("Not a DVD folder! Try again.");
	}
}

sub on_title_combo_changed { # pri zmene titulu napis jeho cislo + 1 a:
	&print_status("DVD title changed");
	$params{'title'} = $f_titles[$widgets{'title_combo'}->get_active];
	@chapters = &functions::get_chapters($params{'input_path'},$params{'title'}); # uzpusob pocet radio kapitol
	my $ok = &get_chapter_combo_ready(@chapters);
	$params{'fps'} = $chapters[0]; # vycucni fps z nulteho prvku pole
	if(@chapters == 2) { # pokud je tu jen jedna kapitola
		&sense(qw(chapter_all_radio),0);
		&sense(qw(chapter_single_radio),1);
	} elsif(@chapters > 2) { # a kdyz je jich vic, tak...
		&sense(qw(chapter_all_radio),1);
		$widgets{'chapter_all_radio'}->set_active(1);
	}
	$params{'length'} = &functions::hrs2sec($titles[$params{'title'}]); # apdejtni vbitrejt
	@audios = &functions::get_audios($params{'input_path'},$params{'title'}); # vycucni audio info
	if(@audios > 0) { # titul ma audiostopy...
		&sense(qw(audio_frame),1); # takze odkryj audiofrejm
	}
	&sense(qw(crop_frame bitrate_frame vcodec_frame),1);
	&update_vbitrate;
	my $ok = &get_audio_combo_ready(@audios);
}

sub on_min_tit_len_chkbtn_toggled {
	if($widgets{'min_tit_len_chkbtn'}->get_active) {
		&sense('min_title_len_spin',1);
		$params{'min_tit_len'} = $widgets{'min_title_len_spin'}->get_value;
	} else {
		&sense('min_title_len_spin',0);
		$params{'min_tit_len'} = false;
	}
	&get_title_combo_ready(@titles);
}

sub on_min_title_len_spin_changed {
	$params{'min_tit_len'} = $widgets{'min_title_len_spin'}->get_value;
	&get_title_combo_ready(@titles);
}
 ###############
### A U D I O ###
 ###############

sub on_audio_combo_changed { # pri zmene audiostopy ji uloz
	&print_status("Audio track changed");
	$params{'audio'} = $widgets{'audio_combo'}->get_active + 1;
	$widgets{'audio_mp3_radio'}->set_active(1);
}

sub on_audio_mp3_radio_toggled { # ac3 nebo mp3 ?
	if($widgets{'audio_mp3_radio'}->get_active) {
		&print_status("Audio codec set to MP3");
		&sense(qw(mp3_bitrate mp3_method replay_gain),1);
		$params{'oac'} = "mp3lame";
		$params{'mp3_bitrate'} = $widgets{'mp3_bitrate'}->get_value;
		$params{'mp3_method'} = $widgets{'mp3_method'}->get_active_text;
		$params{'replay_gain'} = $widgets{'replay_gain'}->get_value;
	} else {
		&sense(qw(mp3_bitrate mp3_method replay_gain),0);
		$params{'oac'} = "copy";
		$params{'mp3_bitrate'} = &functions::get_ac3_bitrate($params{'input_path'},$params{'title'},&get_aid);
		&print_status("AC3 bitrate is $params{'mp3_bitrate'} kbps");
		$params{'mp3_method'} = false;
		$params{'replay_gain'} = false;
	}
	&update_vbitrate;
}

sub on_mp3_bitrate_changed {
	$params{'mp3_bitrate'} = $widgets{'mp3_bitrate'}->get_value;
	&update_vbitrate;
}

sub on_mp3_method_changed {
	&print_status("MP3 compresion method changed");
	$params{'mp3_method'} = $widgets{'mp3_method'}->get_active_text;
}

sub on_replay_gain_changed {
	&print_status("MP3 replay gain changed");
	$params{'replay_gain'} = $widgets{'replay_gain'}->get_value;
}

 #####################
### C R O P P I N G ###
 #####################

# pri kliknuti na cropping zaskrtavatko zapni crop a ziskej rozmery
sub on_crop_checkbutton_toggled {
	my @items = qw(crop_entry auto_crop_btn);
	if($widgets{'crop_checkbutton'}->get_active) {
		if($widgets{'crop_entry'}->get_text) {
			$params{'crop'} = $widgets{'crop_entry'}->get_text;
		}
		&sense(@items,1);
		&print_status("The film will be cropped");
	} else {
		$params{'crop'} = false;
		&sense(@items,0);
		&update_crop("720:576:0:0");
		&print_status("The film will not be cropped");
	}
}

sub on_min_scaled_width_spin_changed {
	&print_status("Minimal width of scaled film is updated");
	$params{'min_scaled_width'} = $widgets{'min_scaled_width_spin'}->get_value;
}

sub update_crop {
	my $crop = shift;
	$params{'crop'} = $crop;
	$params{'crop_width'} = &functions::get_crop_width_from_str($crop);
	my($min,$max) = $widgets{'min_scaled_width_spin'}->get_range;
	$widgets{'min_scaled_width_spin'}->set_range($min,$params{'crop_width'});
	&print_status("Crop updated");
}

sub on_crop_entry_changed {
	my $crop = $widgets{'crop_entry'}->get_text;
	if(&functions::check_crop($crop)) {
		&update_crop($crop);
	}
}

sub on_auto_crop_btn_clicked {
	my $cmd = &get_crop_cmd;
	my @crop = &functions::get_crop($cmd);
	my $crop = $crop[0].":".$crop[1].":".$crop[2].":".$crop[3];
	$widgets{'crop_entry'}->set_text($crop);
	&update_crop($crop);
}

sub on_preview_button_clicked {
	&print_status("Preview was just run");
	my $cmd = &get_preview_cmd;
	system($cmd);
}
 ################################
### V I D E O   B I T R A T E  ###
 ################################

# bitrate nebo CD ?
sub on_fit_to_cd_radio_toggled {
	if($widgets{'fit_to_cd_radio'}->get_active) {
		$widgets{'vbitrate_entry'}->set_sensitive(0);
		&update_vbitrate;
	} else {
		$params{'vbitrate'} = $widgets{'vbitrate_entry'}->get_text;
		$widgets{'vbitrate_entry'}->set_sensitive(1);
	}
}



# nastav velikost media podle komba
sub on_btr_cd_combo_changed {
	my $index = $widgets{'btr_cd_combo'}->get_active;
	$params{'cd_size'} = $cdsize[$index];
	&update_vbitrate;
}

# zkousni rucne zadany bitrate
sub on_vbitrate_entry_changed {
	$params{'vbitrate'} = eval($widgets{'vbitrate_entry'}->get_text);
}

 ###################################
### Q U A L I T Y   O P T I O N S ###
 ###################################

# high quality
sub on_hq_toggled {
	if($widgets{'hq'}->get_active) {
		$params{'hq'} = true;
	} else {
		$params{'hq'} = false;
	}
}
# oprav prokladani
sub on_deint_toggled {
	if($widgets{'deint'}->get_active) {
		$params{'deint'} = true;
	} else {
		$params{'deint'} = false;
	}
}
# vyhlad obraz
sub on_nr_toggled {
	if($widgets{'nr'}->get_active) {
		$params{'nr'} = true;
	} else {
		$params{'nr'} = false;
	}
}

sub on_cartoon_toggled {
	if($widgets{'cartoon'}->get_active) {
		$params{'cartoon'} = true;
	} else {
		$params{'cartoon'} = false;
	}
}


 ###############
#### S A V E ####
 ###############

sub on_run_btn_clicked { # kikni na RUN, dej dohromady CMD a pust ho graficky
	$params{'run_broken'} = false;
	$params{'shutdown'} = false;
	$progress_window_xml = Gtk2::GladeXML->new('/usr/share/dvd2avi/dvd2avi.glade','progress_window');
	$progress_window_xml->signal_autoconnect('connect_callback');
	$widgets{'progress_window'} = $progress_window_xml->get_widget('progress_window');
	$widgets{'progressbar'} = $progress_window_xml->get_widget('progressbar');
	$widgets{'shutdown_btn'} = $progress_window_xml->get_widget('shutdown_btn');
	my $pass;
	my @pass = qw(1 2);
	foreach $pass (@pass) {
			my $cmd = &get_run_cmd($pass);
			if(not $params{'run_broken'}) {
				&run_cmd($cmd,$pass);
			}
	}
	$widgets{'progress_window'}->destroy;
	if($params{'shutdown'}) {
		system("shutdown -h now");
	}
}

sub on_save_avi_btn_clicked {
	&open_save_fs(2);
}

sub on_save_script_btn_clicked { # uloz skript do souboru
	my $checked = $widgets{'crop_checkbutton'}->get_active;
	if(! $checked) {
		&open_save_fs(1);
	} elsif($checked && &functions::check_crop($params{'crop'})) {
		&open_save_fs(1);
	}
	
}

sub open_save_fs { # obecna metoda pro otevreni ukladaciho dialogu,
	$params{'save_fs_id'} = shift;
	my $save_fs_xml = Gtk2::GladeXML->new('/usr/share/dvd2avi/dvd2avi.glade','save_fs');
	$save_fs_xml->signal_autoconnect('connect_callback');
	$widgets{'save_fs'} = $save_fs_xml->get_widget('save_fs');
	$widgets{'save_fs'}->run;
}
sub on_save_fs_open_btn_clicked {
	my $string = $params{'save_fs_id'};
	if($string == 1) {
		$params{'save_script_file'} = $widgets{'save_fs'}->get_filename;
		&save_script;
		&print_status("Encoding script saved");
	} elsif($string == 2) {
		$params{'save_avi_file'} = &functions::slash($widgets{'save_fs'}->get_filename);
		if($params{'save_avi_file'}) {
			$widgets{'save_avi_entry'}->set_text($params{'save_avi_file'});
			my @items = qw(save_script_btn run_btn);
			&sense(@items,1);
			&print_status("Path to avi saved");
		} else {
			$widgets{'save_avi_entry'}->set_text('Not a writeable file!');
			my @items = qw(save_script_btn run_btn);
			&sense(@items,0);
			&print_status("Path to avi NOT saved");
		}
	}
	$widgets{'save_fs'}->destroy;
}
sub on_save_fs_delete_event {
	$widgets{'save_fs'}->destroy;
}
sub on_save_fc_cc_btn_clicked {
	$widgets{'save_fs'}->destroy;
}

sub on_progress_window_cancel_btn_clicked { # zavri progressbar
	$widgets{'progress_window'}->destroy;
	$params{'run_broken'} = true;
	$params{'shutdown'} = false;
	close(RUN);
}
sub on_progress_window_delete_event { # zavri progressbar
	$widgets{'progress_window'}->destroy;
	$params{'run_broken'} = true;
	$params{'shutdown'} = false;
	close(RUN);
}

sub on_chapter_all_radio_toggled { # vybirame kapitolky
	if($widgets{'chapter_all_radio'}->get_active) {
		$widgets{'chapter_combo'}->set_sensitive(0);
		$params{'chapter'} = false;
		$params{'length'} = &functions::hrs2sec($titles[$params{'title'}]);
	} else {
		# zapneme kapitolove kombo
		$widgets{'chapter_combo'}->set_sensitive(1);
		$widgets{'chapter_combo'}->set_active(0);
		$params{'chapter'} = $widgets{'chapter_combo'}->get_active + 1;
		$params{'length'} = &functions::hrs2sec($chapters[$params{'chapter'}]);
	}
	&update_vbitrate;
}

sub on_chapter_combo_changed { # zmena kapitolkoveho spinu
	$params{'chapter'} = $widgets{'chapter_combo'}->get_active + 1;
	$params{'length'} = &functions::hrs2sec($chapters[$params{'chapter'}]);
	&update_vbitrate;
}

sub on_shutdown_btn_toggled {
	if($widgets{'shutdown_btn'}->get_active) {
		$params{'shutdown'} = true;
	} else {
		$params{'shutdown'} = false;
	}
}
