/* Tak se mi to povedlo!! A vsichni kecaj, jak je to tezky! */
/* ale pozor na vic formularu na strance - to podle me nezvladne */
/* 

!!! unsaved check by sel dat taky do onbeforeunload!!

1) max 1 formular na stranku - teda muze jich byt vic, ale nejde zarucit,
   ze uzivatel neutece pryc tim druhym formularem
	- a dodatecna poznamka - mozna by to ani neslo, protoze treba promenna
	  unsaved_data je globalni a ne per form! Tudiz by ani nevedela, ve kterem 
	  formu bylo neco zmeneno (je to mozna jedno, ale mozna taky ne ...)
	- takze na to pozor. Mozna by ale slo dat vic formu s tim, ze na data unsaved se
	  checkuje pouze jeden.
2) 
- pokud se nechce, aby se formular checkoval, prida se mu do class "nocheck"
- pokud se nechce, aby se checkovala nejaka polozka formu, prida se ji do class
  "nocheck_unsaved"
- pokud se chce uplne vypnout kontrola pri kliknuti na odkaz, prida se linku
  do class "nocheck_unsaved" - udelal jsem tuto primejsi cestu, protoze ta 
  nasledujici se mi uz zdala krkolomna:
- pokud se nechce, aby se provadela kontrola pri kliknuti na odkaz, ktery neopousti 
  stranku (napriklad odkaz ktery pousti nejaky javascript), tak at onclick vraci false,
  navic se muze dat (nekde to bylo nutny) href="javascript: return false;" a jeste
  tomu odkazu pridat do class "onclick_before_unsavedchk" - viz nize. Timhle se zaruci 
  zablokovani toho checku.

3) pozor na ruzne jine moznosti opustit stranku - javascriptove!! Napriklad:
	a) onChange="this.form.submit();" - autosubmitovani u ruznych prvku 
		na strance (napriklad rolet)
	b) onClick="window.location='...'"
	c) utek jinym formularem (regulerne tlacitkem submit)
		- to by se jeste dalo ohlidat
    - tam se to zatim musi delat rucne.. zavolanim confirm_leaving()
    
4) pokud chceme aby se u odkazu obsluzna fce onclick volala driv, nez ten test,
   pridame tomu odkazu do class "onclick_before_unsavedchk"

5) je osetreno, kdyz dam ulozit a on mi vrati formular k prepracovani - ted
   se to bere jako uz modifikovany formular, aniz by user do nej kliknul.
   Musi to ale podporovat phpko. Dela to tak ze kdyz se vraci formular k 
   opraveni tak ve formu prijde hidden  field unsaved_chk__data_unsaved 
   nastaveny na 1.
	=> s timto je spojen urcity problem, zejmena pokud formular pouziva funkci 
	   form.reset. Vice o tom viz tools/form.php
	=> dalsi problem by nastal kdyby tech formu tam bylo vic ... ale tento problem
 	   by nastal i bez unsaved_chk__data_unsaved

!!! pozor !! Je tu jeden problem - pokud existuje puvodni obsluha onchange, a tahle obsluha
zfailuje z nejakych javascriptovych duvodu (to uz se mi stalo!) tak se nezavola ani ten nas handler!
To se mi stalo, a to tak ze jsem mel onchange atribut a v nem volani nejake me javascriptove fce 
a v te fci to selhalo.
	- ale to se asi neda nic delat

*/

var unsaved_data = 0;
var was_installed = 0;
var unsaved_chk_available = 1;

function add_confirm_to_hrefs()
{
	var hrefs=document.getElementsByTagName('a');
//	alert('here');
	for (i = 0; i < hrefs.length; i++) {
//		if (hrefs[i].className)
//			console.log("href class: " + hrefs[i].className);
	    if (!hrefs[i].className.match("nocheck_unsaved")) {
//	    	jQuery(hrefs[i]).addClass('red');
//	    	if (hrefs[i].className)
//	    	console.log("go inside");
		//hrefs[i].onclick = 'return confirm("really?");';
		hrefs[i].old_onclick_bef_unschk = hrefs[i].onclick;
		hrefs[i].onclick = function() {
			call_old_onclick_first = this.className.match("onclick_before_unsavedchk");
			if (call_old_onclick_first) {
				if (this.old_onclick_bef_unschk)
					rv = this.old_onclick_bef_unschk();
				if (!rv)
					return false;
			}
			if (!confirm_leave())
				return false;
			if (!call_old_onclick_first && this.old_onclick_bef_unschk)
				return this.old_onclick_bef_unschk();
			return true;
		}
	    }
	}
}

function confirm_leave() 
{ 
	if (unsaved_data) {
		proceed = confirm("Ve formuláři jsou neuložená data. Chcete skutečně provést požadovanou akci?\n\n(kliknutím na OK o změny přijdete)"); 
		//proceed = !confirm("Vaše změny nejsou uloženy. Chcete se vrátit do formuláře?\n\n(zápornou odpovědí o změny přijdete)"); 
		//proceed = !confirm("Vaše změny nejsou uloženy. Chcete se vrátit do formuláře?"); 
		//proceed = !confirm("Vaše změny nejsou uloženy. Chcete se vrátit do formuláře? Odpovíte-li záporně, o své změny přijdete."); 
		if (!proceed)
			return false;
	}
	return true;
}


function set_onchange(obj)
{
/*	obj.onchange = function() {
		alert('hh');
	} 
*/
	obj.old_onchange_bef_unschk = obj.onchange;
	obj.onchange = function() { 
		if (obj.old_onchange_bef_unschk)
			obj.old_onchange_bef_unschk();
		data_modified();
	}
	if (obj.old_onchange_bef_unschk) {
	//	alert('y' + obj.nodeName + obj.nodeValue + obj.nodeType);
		//obj.className = "invisible";
	}

	/* !!! zajimave, ze tady to 'obj.' funguje stejne jako 'this.' !!! */
}

function set_onchange_foralltags(tag_name)
{
	var forms = document.getElementsByTagName('form');
	for (i = 0; i < forms.length; i++)
		if (!forms[i].className.match("nocheck")) {
			
			var inputs = forms[i].getElementsByTagName(tag_name);
			for (j = 0; j < inputs.length; j++)
				if (!inputs[j].className.match("nocheck_unsaved"))
					set_onchange(inputs[j]);
		}
}

function set_onchange_foralltags__orig(tag_name)
{
			var inputs = document.getElementsByTagName(tag_name);
			for (i = 0; i < inputs.length; i++)
				set_onchange(inputs[i]);
}

// toto spustit v window.onload:
// mela by se spis jmenvoat init...
function add_guard_to_forms()
{
	set_onchange_foralltags('input');
	set_onchange_foralltags('select');
	set_onchange_foralltags('textarea');

	spec = document.getElementsByName('unsaved_chk__data_unsaved')[0];
	if (spec && spec.value) {
		data_modified();
	}
}

//add_chk_to_hrefs();

function data_modified()
{
//	console.log("data_modified()");
	if (!unsaved_data) {
		unsaved_data = 1;
		if (!was_installed) {
			add_confirm_to_hrefs();
			was_installed = 1;
		}
		//var unsaved = document.getElementById('unsaved_flag');
		//unsaved.className = 'unsaved_flag_set';
		
		var report_save = document.getElementById('report_save');
		if (report_save)
			report_save.className = 'invisible';
	}
}

function data_cancel(new_url)
{
	if (!unsaved_data || confirm('Opravdu chcete přijít o změny ve formuláři?')) { 
		unsaved_data = 0 /* pro jistotu i v pripade url, kdyby to same url nebo # */; 
		if (new_url)
			window.location = new_url;
		return true;
	} 
	else 
		return false;
}


window.onload_before_unsaved_chk34234 = window.onload;
window.onload = function()
{
	if (window.onload_before_unsaved_chk34234)
		window.onload_before_unsaved_chk34234();
	add_guard_to_forms();
}

// pouziva se jen pri pouziti jquery-ui dialogu
// vzato z input_dialog_tree.js, spousta komentu tady se vaze k tomu puvodnimu
// @@@@@@ ale na tohle strasnyho bacha!!! protoze pak vsechny odkazy v dialogu
// musej bejt opravdu bezpecny a nesmej reloadovat stranku! (kdyztak davat target="_blank")
// a nebo to fakt udelat jinak - aby tenhle unsaved chk skript poznal podle href a target co
// je a co neni nebezpecny, nebo jeste lip, vyuzit konecne onunload!!!
function dialog_nocheck_unsaved()
{
	//$("#tree_dialog a").addClass("nocheck_unsaved");
		//!!! tohle nefunguje na ten zaviraci krizek, 
		// ten se tam doda nejak dodatecne a 
		// to id #tree_dialog se tomu divu totiz nejak sebere!
		// nechapu... musim na to pres class:
		
	// @@@ jak dlouho tohle trva, kdyz direct = true - jestli to nezdrzuje 
	// (170ms, to je docela dost)
	//t1 = (new Date()).getTime();
	jQuery(".ui-dialog a").addClass("nocheck_unsaved");
		// spoluprace s unsaved_chk
	//t2 = (new Date()).getTime();
	//console.log("dialog_nocheck_unsaved(): trvalo to " + (t2 - t1) + " ms");
}

