/*
modyfikacje do prototype.js. Służą one do tego, żeby dało się - w miarę przezroczyście - używać wbudowanych
w bibliotekę funkcji serializacji formularza.

Problem:
Wszystko jest OK, tak długo, aż nie trzeba się babrać w multiselektach, Standard jest taki, że są one przesyłane jako - skandal! - seria
kluczy o takich samych nazwach, a różnych wartościach. Czyli:
multis=ala&multis=beta&multis=15
PHP odpakowuje to po kolei, jak gdyby tak:
$multis = 'ala' & $multis = 'beta' ; $multis = '15';
tak że nowsze wartości takiego samego klucza nadpisują starsze. Więc korzysta się ze sztuczki.
Nadaje się multiselektowi name kończący się na [] . Wtedy PHP wykonuje serie poleceń w rodzaju:
dla parametrów: multis[]=ala&multis[]=beta
$multis[]='ala'; $multis[] = 'beta'
Czyli jest OK, wszystko kończy jako tablica.
Problem jest po stronie javascriptu, gdzie - choćbyśmy chcieli - nie możemy trzymać parametrów jako tablicy asocjacyjnej!
funkcja do serializowania formularza zwraca dla multiselekta jeden klucz z wartościami zimplodowanymi przecinikiem (to zresztą przypadek,
wynikający z tego, że Array(1,2).toString == '1,2')
Zrobiłem dwie rzeczy:
 - dodałem do serializacji multiselecta łączenie tyldą jako magicznym znaczkiem. Używa się jej mimo wszystko rzadziej niż przecinka.
 - dodałem w Hash.toQueryString pętlę przepisującą argumenty w postaci a=12~b~c na a=12&a=b&a=c.
 Powinno działać.
 Dodatkowo: w prototype serializacja działała na wszystkich elementach formularza, także disabled. Podmieniłem Form.serialize na funkcję,
 która serializuje tylko kontrolki enabled.
*/

//new Effect.Opacity('my_element',
//    { duration: 2.0,
//      transition: Effect.Transitions.linear,
//      from: 1.0, to: 0.5 });

if (typeof Prototype == 'undefined' || Prototype.Version != '1.5.0_rc0' && Prototype.Version != '1.5.1') {
	alert('f3.js wymaga biblioteki Prototype w wersji 1.5.0rc0 lub nowszej')
}

// patche potrzebe tylko do starego Prototypa
if (Prototype.Version == '1.5.0_rc0') {
	Form['serialize'] = function(form) {
		var elements = Form.getElements($(form));
		var queryComponents = new Array();

		for (var i = 0; i < elements.length; i++) {
			if(!elements[i].disabled){
      				var queryComponent = Form.Element.serialize(elements[i]);
				if (queryComponent)
					queryComponents.push(queryComponent);
			}
		}
		return queryComponents.join('&');
	};

	Form.Element['serialize'] = function(element) {
		var element = $(element);
		var method = element.tagName.toLowerCase();
		var parameter = Form.Element.Serializers[method](element);

		if(parameter && typeof parameter[1] == 'object' && parameter[1].constructor == Array){
			// do zbadania: chyba bzudrę napisałem, powinno być .join('~')
			parameter[1] = parameter[1].toString().replace(/,/g,'~');
		}
		if (parameter)
			return encodeURIComponent(parameter[0]) + '=' +
			encodeURIComponent(parameter[1]);
	};

	String.prototype.toQueryParams = function() {
		var pairs = this.match(/^\??([\s\S]*)$/)[1].split('&');
		return pairs.inject({}, function(params, pairString) {
			var pair = pairString.split('=');
			if (!params[pair[0]]){
				params[pair[0]] = pair[1];
			}
			else {
				params[pair[0]] += '~'+pair[1];
			}
			return params;
		});
	};

	Hash.toQueryString = function() {
		var temp = this.map(function(pair) {
			return pair.map(encodeURIComponent).join('=');
		}).join('&');
		while (temp.indexOf('~')!=-1){
			temp = temp.replace(/(&?)([^&=]*)=([^&~]*)~([^&]*)/,"$1$2=$3&$2=$4");
		}
		return temp;
	};
};

var semafor = 0;

function f3_send_request(event){
	var formularz = false;
	Event.stop(event);
	if (semafor==1){
		return
	}
	semafor = 1;
	setTimeout("semafor=0", 500);
	var ja = Event.element(event);
	if (ja.tagName == 'INPUT'){
		ja = ja.parentNode;
	}
	var ajaxroot = ja;
	while (ajaxroot.className.indexOf('ajaxroot')==-1){
		if (ajaxroot.tagName=='FORM') formularz=ajaxroot;
		ajaxroot = ajaxroot.parentNode;
		if (ajaxroot==document){
			break;
		}
	}
	switch(event.type){
		case 'submit':

			if (!f3_validate_form(formularz)){
				return false;
			}
//			anchor_params = $H(decodeURI(Form.serialize(ja)).toQueryParams());
			anchor_params = $H(decodeURI(Form.serialize(formularz)).toQueryParams());
//			DumperAlert(anchor_params);

			// zakładamy, że na razie nie będą brane pod uwagę parametry ustawione w action.
			// FIXME
			anchor_url = '';
			break;
		case 'click':
			var anchor_q = ja.href.indexOf('?');
			if (anchor_q==-1){
				var anchor_url = ja.href;
				var anchor_params = $H();
			}
			else {
				var anchor_url = ja.href.substring(0,anchor_q);
				var anchor_params = ja.href.substring(anchor_q);
				anchor_params = $H(anchor_params.toQueryParams());
			}
			break;
	}

	//DumperPopup(anchor_params);
	if (ajaxroot!=document){
		var ajaxroot_params = $H(ajaxroot.className.substring(9).toQueryParams());
	} else {
		var ajaxroot_params = $H();
	}
	// pierwszenstwo maja parametry z ajaxroota.
	var mixed_url = anchor_url

	var Hmixed_params = anchor_params.merge(ajaxroot_params);
	var mixed_params = Hmixed_params.toQueryString();

	if(ajaxroot!=document && anchor_params.toQueryString().indexOf('ajax=0') == -1 ){
		// formularz wysyłany w całości ajaksem (wpisany do ajaxroota)

		// jeśli formularz życzy sobie przeładować stronę albo cofnąć po wykonaniu akcji, to trzeba wykonać akcję synchronicznie
		var async = true;
		if (formularz && formularz.hasClassName('reload')) {
			async = false
			callback = function() { window.location.reload() }
		}
		else if (formularz && formularz.hasClassName('back')) {
			async = false
			callback = function() { history.back() }
		}
		var myAjax = new Ajax.Updater(ajaxroot, mixed_url, {
			asynchronous: async,
			method: 'get',
			parameters: mixed_params+'&utf=1',
			f3_magic: ajaxroot,
			insertion: f3_insert_and_ajaxify,
			onSuccess: async ? f3_use_json_header : undefined
		});
		if (!async) {
			var json = myAjax.evalJSON();
			f3_use_json_header(null,json);
			if (!json['errors']) {
				callback();
			}
		}
	} else {
		// formularz wysyłany hybrydowo: akcja akajsem, a potem normalnie przeglądarką

		// najpierw robimy linka pozbawionego rzeczy, które pójda z formy:
		var Hnew_href = {}
		for (ap in Hmixed_params){
			// usuwamy rzeczy związane z akcją, submita (pusta nazwa) i ajaksa
			if (!ap.match(/^_act|^action|^$|^ajax$/i)){
				Hnew_href[ap] = Hmixed_params[ap]
			}
		}
		new_href = '?'+$H(Hnew_href).toQueryString();

		// potem podmieniamy screen na pusty:
		Hmixed_params['screen'] = 'empty'
		mixed_params = anchor_params.merge(ajaxroot_params).toQueryString();

		// asynchronous:false jest niezbędne do synchronizacji akcji z przejściem
		mixed_url = window.location.href.split('?')[0];
		var myAjax = new Ajax.Request(
					mixed_url,
					{
						method: 'post',
						parameters: mixed_params+'&utf=1',
						asynchronous: false
					}
		);
		var json = myAjax.evalJSON();
		//	confirm(json->['confim']);
		f3_use_json_header(null,json);
		if (!json['errors']) {
		// przechodzimy tam, gdzie mieliśmy przejść
			if (formularz && formularz.className.indexOf('reload') != -1) {
				window.location.reload();
			} else if (formularz && formularz.className.indexOf('back') != -1) {
				history.back();
			} else {
				window.location = new_href + '&' + json['urls'];
			}
		}
	}
}

function prepare_forms(elm){
	formy = elm.getElementsByTagName('FORM');
	for (var l = 0; l< formy.length; l++){
		var forma = formy[l];
		if (Element.hasClassName(forma,'detach')){
			f3_detach_form(forma);
		}
		if (Element.hasClassName(forma,'noprepare')){
			continue;
		}
		var strip_inputs = false;
		if (Element.hasClassName(forma,'strip_empty_inputs')){
			Event.observe(forma, 'submit', f3_strip_empty, false);
		}
		var selects = forma.getElementsByTagName('select');
		for (var f = 0; f < selects.length; f++){
			if (selects[f].onchange) selects[f].onchange();
			Event.observe(selects[f], 'change', f3_element_changed_handler, false);
		}
		var inputs = forma.getElementsByTagName('input');
		for (var f = 0; f < inputs.length; f++){
			Event.observe(inputs[f], 'click', f3_input_clicked_handler, false);
			Event.observe(inputs[f], 'change', f3_element_changed_handler, false);
			Event.observe(inputs[f], 'keypress', f3_element_changed_handler, false);
			if(inputs[f].type=='submit'){
				inputs[f].disabled = true;
			}
		}
		var textareas = forma.getElementsByTagName('textarea');
		for (var f = 0; f < textareas.length; f++){
			Event.observe(textareas[f], 'change', f3_element_changed_handler, false);
			Event.observe(textareas[f], 'keypress', f3_element_changed_handler, false);
		}
	}
}

function f3_strip_empty(event){
	var inputy = Event.element(event).getElementsByTagName('input');
	for (var v=0; v<inputy.length; v++){
		if (inputy[v].value==''){
			inputy[v].disabled = true;
		}
	}
}

/*
function f3_element_changed_handler(event){
	var ja = Event.element(event);
	Element.addClassName(ja,'modified');
	var forma = Event.findElement(event,'form');
	var inputy = forma.getElementsByTagName('input');
	for (var i=0; i<inputy.length; i++){
		if(inputy[i].type=='submit') inputy[i].disabled = false;
	}
}
*/

function f3_input_clicked_handler(event){
	var ja = Event.element(event);
	if (ja.value.match(/imię pracownika|nazwisko pracownika/i)){
		ja.value = ''
		f3_element_changed(ja)
	}
}

function f3_element_changed_handler(event){
	var ja = Event.element(event);
	if(event.which==61 && Element.hasClassName(ja,'number')){
		Event.stop(event)
		ja.value=eval(ja.value.replace(/,/,'.'))
	}
	f3_element_changed(ja);
}

function f3_element_changed(ja){
	Element.addClassName(ja,'modified');
	var forma = ja;
	while (forma.tagName!='FORM'){
		forma = forma.parentNode;
	}
	var inputy = forma.getElementsByTagName('input');
	for (var i=0; i<inputy.length; i++){
		if(inputy[i].type=='submit') inputy[i].disabled = false;
	}

}

function f3_fill_ajaxroot(ajaxroot,url){
	ajaxroot = $(ajaxroot);
	var myAjax = new Ajax.Updater( ajaxroot, url, { method: 'get', insertion: f3_insert_and_ajaxify});
}

function f3_use_json_header(myAjax, json){
	if (json) {
		if (json['errors']) f3_error_encoded(json['errors']);
	} else {
		f3_error_encoded('Wystąpił błąd f3, ale nie udało się go zidentyfikować. Powiadom o tym programistów.');
	}
}

function f3_insert_and_ajaxify(elm,text){
//	elm = $(elm);
	Element.update(elm,text);
	f3_ajaxify(elm);
	prepare_forms(elm);
}

function f3_ajaxify(elm){
	linki = $(elm).getElementsByTagName('A');
	for(var f = 0; f< linki.length; f++){
		if (linki[f].href.match(/#$|#stub$/)){
			continue;
		}
		if (Element.hasClassName(linki[f],'noajax')){
			continue;
		}
		Event.observe(linki[f], 'click', f3_send_request, false);
	}
	linki = $(elm).getElementsByTagName('form');
	for(var f = 0; f< linki.length; f++){
		if (Element.hasClassName(linki[f],'noajax')){
			continue;
		}
		Event.observe(linki[f], 'submit', f3_send_request, false);
	}
}

function pad(num,ile) {
    var str = '' + num;
    while (str.length < ile)
        str = '0' + str;
    return str;
}

function str_to_date(str){
	args = str.split(/[-,:T ]/).concat([0,0,0,0,0]);
	return new Date(args[0],args[1]-1,args[2],args[3],args[4]);
}

function date_to_str(date){
	return date.getFullYear() + '-'
		+ pad(date.getMonth()+1,2) + '-'
		+ pad(date.getDate(),2) + 'T'
		+ pad(date.getHours(),2) + ':'
		+ pad(date.getMinutes(),2)
}

// wersja z podawaniem parametrów ze znakiem "równa się" (zdeprekowana)
function get_param_from_class_eq(ob,par){
	kl = $(ob).className
	kls = "^.*" + par + "=([^ ].*).*$";
	kl = kl.replace(new RegExp(kls), "$1");
	return kl;
}

function get_param_from_class(ob,par){
	kl = $(ob).className
	kls = "^.*" + par + "([^~]*).*$";
	kl = kl.replace(new RegExp(kls), "$1");
	return kl;
}

function set_param_from_class_eq(ob,par,val){
	ob = $(ob);
	kl = ob.className
	kl = kl.replace(new RegExp("(" + par + ")=([^ ].*)"), "$1=" + val);
	ob.className = kl;
}

function f3_input_wrong (inp){
	if(!inp.previousSibling)return;
	
	inp.previousSibling.style.display='inline';
	var x = inp;
	// jeżeli formularz jest ukryty, to trzeba go pokazać
	if (x != document) {
		while (true){
			x = x.parentNode;
			if (x == document) break;
			if (x.style.display=='none') x.style.display = '';
		}
	}
	inp.focus();
}

function f3_input_right (inp){
	if(!inp.previousSibling)return;
	
	inp.previousSibling.style.display='none';

}

function f3_validate_form(fo){
	if (Element.hasClassName(fo,'novalidate')) return true;
	//	return false;
	elms = fo.getElementsByTagName('INPUT');

	for (var f=0; f < elms.length; f++){
		elm = elms[f];
		val = elm.value;
		//alert (elm.className.replace(/^([^ ]*).*$/i,'$1'))
		if (Element.hasClassName(elm,'nullable') &&
		    val.match(/^$/)) {
			f3_input_right(elm);
		}
		else {
			switch(elm.className.replace(/^([^ ]*).*$/i,'$1')){
				case 'text':
					if (!val.match(/.+/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'number':
					if (!(val.replace(/\s/g, '')).match(/^-?\s*\d+((\.|,)\d+)?\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'number_nullable':
					if (!(val.replace(/\s/g, '')).match(/^-?\s*\d*((\.|,)\d+)?\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'integer':
					if (!(val.replace(/\s/g, '')).match(/^-?\s*\d+\s*$/)) {
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'date':
					if (!val.match(/^\s*\d\d\d\d-\d\d-\d\d\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'time':
					if (!val.match(/^\s*([1-9]|([0-1][0-9])|(2[0-4])):[0-5]?[0-9]?(:[0-5]?[0-9])?\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'date_nullable':
					if (!((val.match(/^\s*\d\d\d\d-\d\d-\d\d\s*$/)) || (val == ''))) {
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'timestamp':
					if (!val.match(/^\s*\d\d\d\d-\d\d-\d\d\s*\d\d:\d\d:\d\d$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'timestamp_nullable':
					if (!((val.match(/^\s*\d\d\d\d-\d\d-\d\d\s*\d\d:\d\d:\d\d$/)) || (val == ''))) {
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'kod_pocztowy':
					if (!val.match(/^\s*\d\d-\d\d\d\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'kod_pocztowy_nullable':
					if (!(val.match(/^\s*\d\d-\d\d\d\s*$/) || (val == ''))){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'nip':
					if (!val.match(/^\s*\d\d\d-\d\d\d\-\d\d-\d\d\s*$/) && !val.match(/^\s*\d\d\d-\d\d-\d\d-\d\d\d\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'proc':
					if (!val.match(/^\s*\d+\s*$/) || (!(parseInt(val)>=0)) || (!(parseInt(val)<=100))){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'proc_not_zero':
					if (!val.match(/^\s*\d+\s*$/) || (!(parseInt(val)>0)) || (!(parseInt(val)<=100))){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'pesel':
					if (!val.match(/^\s*\d\d\d\d\d\d\d\d\d\d\d\s*$/)){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;

				case 'pesel_nullable':
					if (!(val.match(/^\s*\d\d\d\d\d\d\d\d\d\d\d\s*$/) || (val == ''))){
						f3_input_wrong(elm);
						return false;
					} else {
						f3_input_right(elm);
					}
					break;
			}
		}
	}
	elms = fo.getElementsByTagName('SELECT');

	for (var f=0; f < elms.length; f++){
		elm = elms[f];
		val = elm.value;
		if (val == '' && !elm.disabled) {
			f3_input_wrong(elm);
			return false;
		} else {
			f3_input_right(elm);

		}
	}

	return true;
}

function f3_array_from_collection(kolekcja) {
	var a = new Array();
	for (var i = 0; i < kolekcja.length; i++)
		a[a.length] = kolekcja[i];
	return a;
}

function f3_onchange_affect_ex(elm, obj, prefix){
	if (obj.prefix) prefix = obj.prefix;
	var prefix_pure = prefix.replace(/\d*_$/,'');
	var formelm = elm;
	while (formelm.tagName != 'FORM'){
		formelm = formelm.parentNode;
	}

	if (obj.wholepage) formelm = document;
	var elms1 = f3_array_from_collection(formelm.getElementsByTagName('input'));
	var elms2 = f3_array_from_collection(formelm.getElementsByTagName('select'))
	var elms = elms1.concat(elms2)

	for (var v = 0; v < elms.length; v++){
		var name = elms[v].name;
		name = name.replace(new RegExp('^'+prefix_pure+'\\d*_*'),'');
		//if (!confirm(name))break;
		// sprawdź nazwę kontrolki
		if (!obj[name]) continue;

		// udało się, nazwa kontrolki zgodna z nazwą regułki
		var instructions = obj[name];
		var target = elms[v];
		var val = elm.value;
		for (var f = 0; f < instructions.length; f++){
			// sprawdzenie, czy są jakieś dodatkowe warunki do wykonania instrukcji
			if (instructions[f]['test']){
				// tutaj będziemy mieć złożonosć kwadratow±, ale jak to będzie problemem,
				// łatwo zmienić rozwi±zanie na efektywniejsze
				var testname = elms[v].name.replace(new RegExp(name + '$'),'') + instructions[f]['test']['name'];
				var testvalue = new RegExp (instructions[f]['test']['value']);
				var test_passed = false;
				for (var r = 0; r < elms.length; r++){
					if ( elms[r].name == testname && elms[r].value.match(testvalue)){
						test_passed = true;
						break;
					}
				}
				if (!test_passed) continue;
			}
			switch(instructions[f]['type']){
			case 'disable':
				if (instructions[f]['disabling_values'].indexOf(val)!=-1){
					target.disabled = true;
				} else {
					target.disabled = false;
				}
				break;
			case 'limit':
				f3_limit_select(target, instructions[f]['limit_criterion'],val);
				break;
			case 'notnull':
				if (instructions[f]['notnulling_values'].indexOf(val)!=-1){
					f3_limit_select_notnull(target,true);
				} else {
					f3_limit_select_notnull(target,false);
				}
				break;
				break;
			case 'limit_beginswith':
				f3_regexp_limit_select(target, instructions[f]['limit_criterion'],new RegExp("^" + val));
				break;
			case 'limit_contains':
				f3_regexp_limit_select(target, instructions[f]['limit_criterion'],new RegExp(val,"i"));
				break;
			case 'set':
				var klasa = (instructions[f]['value_to_set'])
				target.value = get_param_from_class(elm.options[elm.selectedIndex],klasa);
				break;
			case 'clone':
				target.value = val;
				break;
			case 'debug':
				target.value += 'o';
				break;
			case 'alert':
				alert(target.name + ' : ' + target.value + ' : ' + val);
				break;
			}
		}
	}
}

function f3_limit_select(target,crit,selector){
	var regexp = new RegExp("^" + selector + "$");
	f3_regexp_limit_select(target,crit,regexp);
}

function f3_limit_select_notnull(target,limit){
	var options = target.getElementsByTagName('option');
	for (var f = 0; f< options.length; f++){
		if(options[f].value == 'Null'){
			options[f].style.display = limit ? 'none' : '';
		}
	}
}

function f3_regexp_limit_select(target,crit,regexp){
	var options = target.getElementsByTagName('option');
	var cur_sel = target.selectedIndex;
	var first_visible = -1;
	for (var f = 0; f< options.length; f++){
		var val = options[f].className.replace(new RegExp(".*" + crit + "([^~]*)~"), "$1");
		if(val.match(regexp) || options[f].value == 'Null'){
			options[f].style.display = '';
			if (first_visible==-1) first_visible = f;
		} else {
			options[f].style.display = 'none';

			if(f==cur_sel)
				target.selectedIndex = -1
		}
	}
	if (target.selectedIndex==-1){
		target.selectedIndex = first_visible;
	}
}


function f3_onchange_affect(elm,criterion,name){
	while (elm.tagName != 'FORM'){
		elm = elm.parentNode;
	}
	elms = elm.getElementsByTagName('select');
	for (var v = 0; v < elms.length; v++){
		if (elms[v].name == name){
			elms[v].selectedIndex = -1;
			options = elms[v].getElementsByTagName('option');
			for (var f = 0; f< options.length; f++){
				if(options[f].className == criterion){
						options[f].style.display = '';
				} else {
						options[f].style.display = 'none';
						options[f].selected = false;
				}
			}
		}
	}
}


// zamienia formularz tak, żeby przy submicie:
//  - wysyłał ajaksem prawdziwego submita
//  - kasował atrybut 'action' i przechodził już normalnie na następny skrin
function f3_detach_form(form){
		Event.observe(form, 'submit', f3_send_request, false);
}

// okazjonalizmy:
function uloz_dni(){
	uloz_dzien($('dzien1').firstChild);
	uloz_dzien($('dzien2').firstChild);
	uloz_dzien($('tb').firstChild);
}

function mod_ul_start_time(ul,hour){
	var ct = get_param_from_class_eq(ul,'time');
	var a = ct.substring(0,11)+hour;
	set_param_from_class_eq(ul,'time',ct.substring(0,11)+hour)
}

function uloz_dzien(li){
	var ul = $(li).parentNode;
//	ul = $(ul);
	date = str_to_date(get_param_from_class_eq(ul,"time"));
	var lis = ul.getElementsByTagName('li');
	for (var f = 0; f < lis.length; f++){
		var inputs = lis[f].getElementsByTagName('input');
		inputs[0].value = date_to_str(date);
		date.setMinutes(date.getMinutes()+parseInt(inputs[1].value));
		if (ul.id!='tb'){
			lis[f].getElementsByTagName('span')[0].innerHTML = inputs[0].value.substring(11) + ' - ' + date_to_str(date).substring(11);
		} else {
			lis[f].getElementsByTagName('span')[0].innerHTML = " --- ";
		}
		var she = (new Array(2,2,2.2,3,3.5,3.6,4,4.5,5,5.5,6))[(Math.floor(parseInt(inputs[1].value)/20))];
		she = she.toString() + 'em';
		if (lis[f].style.height != she){
			lis[f].style.height = she;
		}
	}
}

function ustaw_kolejnosc_dni_zjazdow_w_instancji(){

}

function ustaw_kolejnosc_modulow_w_przedmiocie(){
	var inputy = $('sortable_moduly').getElementsByTagName('input');
	var licznik = 1;

	for (var v=0; v < inputy.length; v++){
		if (inputy[v].name.match(/^_act.*kolejnosc/)){
			inputy[v].value = licznik++;
		}
	}
}

// szymon: nie wiem czy to dobre miejsce
// fdreger: jak każde inne :-)

function cpv_popup(id) {
        window.open("?screen=searchcpv&field_id="+id, "cpv_"+id, "resizable=yes,scrollbars=yes,width=400,height=400");
}

function set_cpv(id, cpv) {
	opener.document.getElementById(id).value = cpv;
}

function f3_menusection(sekcja){
	sekcja = $(sekcja);
	var menu = $('menulist');
	sekcje = menu.getElementsByTagName('div');
	for(var i = 0; i < sekcje.length; i++){
		if(sekcje[i]!=sekcja){
			Element.removeClassName(sekcje[i],'menusectionselected');
			sekcje[i].nextSibling.style.display='none';
		}
	}
	Element.addClassName(sekcja,'menusectionselected');
	if(sekcja) sekcja.nextSibling.style.display='';
}

function f3_setinput(input,val){
	inputy = document.getElementsByTagName('input');
	for (var f = 0; f<inputy.length; f++){
		//alert(inputy[f].name+' : '+input);
		if(inputy[f].name == input){
			inputy[f].value = val;
		}
	}
}


function f3_check_whole_tr(inp){
	stan = inp.checked;
	while (inp.tagName!='TR'){
		inp = inp.parentNode;
	}
	inps = inp.getElementsByTagName('input');
	for (var f = 0; f < inps.length; f++){
		if (inps[f].type=='checkbox') inps[f].checked = stan;
	}
}

function f3_sumator(element,nazwa){
	var boundary = element;
	while (boundary.className!='sumboundary') boundary = boundary.parentNode;
	var suma = 0;
	inputy = boundary.getElementsByTagName('input');
	for (var r = 0; r < inputy.length ; r++){
		if (inputy[r].name && inputy[r].name.indexOf(nazwa) != -1){
			suma += parseFloat(inputy[r].value);
		}
	}
	element.innerHTML = suma.toFixed(2);
}

function f3_switch_row_to_edit_row(element){
	var tr = element;
	while (tr.tagName!='TR'){
		tr = tr.parentNode;
	}
	tr.style.display = 'none';
	tr.nextSibling.style.display = '';
}

// obsługa terminów studiów:

function f3_dzienzjazdu_wez_daty_z_forma(){
	var inputy = f3_array_from_collection($('sortable_dni').getElementsByTagName('input'));
	inputy = inputy.findAll(function(inp){return inp.name.match(/data_dnia_zjazdu$/i)})
	// inputy.sort(function(a,b){return a.value < b.value ? -1 : 1});
	return inputy;
}

function f3_dzienzjazdu_wez_daty_z_kalendarza(){
	var tdy = f3_array_from_collection($('maly_kalendarz_po_prawej').getElementsByTagName('td'));
	tdy = tdy.findAll(function(td){return td.className=='dzienzjazdu_tak'})
	return tdy;
}

function f3_dzienzjazdu_tabela_do_kalendarza(){
	f3_dzienzjazdu_wez_daty_z_forma().each(function(inp){
		$('dzien_zjazdu'+inp.value).className = 'dzienzjazdu_tak';
	});
}

function f3_dzienzjazdu_kalendarz_do_tabeli(highlight){
	var inputy = f3_dzienzjazdu_wez_daty_z_forma();
	var tdy =  f3_dzienzjazdu_wez_daty_z_kalendarza();
	var new_val = '';
	for (var f=0; f < inputy.length; f++){
		new_val='';
		if (f < tdy.length){
			new_val = tdy[f].id.substring(12);
		}
		if (inputy[f].value != new_val){
			inputy[f].value = new_val;
 			if (highlight) new Effect.Highlight(inputy[f].parentNode.parentNode, {duration: 0.5, startcolor:'#999999', endcolor:'#e5ebf4'});
		}
	}
}

function f3_dzienzjazdu_klikniety(element){
	if (element.className=='dzienzjazdu_tak'){
		element.className = 'dzienzjazdu_nie';
	} else {
		element.className = 'dzienzjazdu_tak';
	}
	f3_dzienzjazdu_kalendarz_do_tabeli(true);
}

function f3_dzienzjazdu_mouseover(element){
	var inputy = f3_array_from_collection($('sortable_dni').getElementsByTagName('input'));
	input = inputy.find(function(inp){
		return inp.name.match(/data_dnia_zjazdu$/i) && inp.value == element.id.substring(12);
	});
	if (input) new Effect.Highlight(input.parentNode.parentNode, {duration: 0.5, startcolor:'#999999', endcolor:'#e5ebf4'});
}

// kolumny liczone od 0
function f3_schowaj_kolumne_tabeli(tabela, kolumna) {

	var rows = tabela.rows;

    for (var row = 0; row < rows.length; row++) {
      rows[row].cells[kolumna].style.display = 'none';
    }
}

// kolumny liczone od 0
function f3_pokaz_kolumne_tabeli(tabela, kolumna) {
	var rows = tabela.rows;

    for (var row = 0; row < rows.length; row++) {
      rows[row].cells[kolumna].style.display = '';
    }
}

function f3_error_encoded(msg){
	$('errors_message').innerHTML = unescape(msg).replace(/\+/g, ' ');
	$('errors').style.display='';
}

var ajax_schedule = {
	element:0,
	url:0,
	timeout:0,
	selected:0,
	visible:false
};

function f3_hide_ajax_dropdown() {
	if (ajax_schedule.timeout) {
		clearTimeout(ajax_schedule.timeout);
	}
	ajax_schedule.visible = false;
	ajax_schedule.selected = 0;
	ajax_schedule.element.nextSibling.nextSibling.style.display = 'none';
}

function f3_fill_ajax_dropdown() {
	ajax_schedule.element.nextSibling.value = ajax_schedule.selected.firstChild.nextSibling.className;
	ajax_schedule.element.value = ajax_schedule.selected.firstChild.nextSibling.nextSibling.className;
	f3_hide_ajax_dropdown();
}

function f3_schedule_ajax_dropdown(event,element,url,takeID){

	/* parametr domyslny */
	if (arguments.length < 4) {
	    takeID = 'true';
	}

	ajax_schedule.element = element;
	ajax_schedule.url = url;
	if (ajax_schedule.timeout) {
		clearTimeout(ajax_schedule.timeout);
	}

	/* przepisujemy input, w razie gdyby ktos wyslal formularz nie wybierajac nic z dropdownu */
	/* (ale w razie entera nie, bo to znaczy, ze przechwycono juz akcje w onkeypressed i wypelniono input dobra wartoscia */
	if (event.keyCode != Event.KEY_RETURN) element.nextSibling.value = element.value;

	/* pusty input albo ESC chowaja dropdown */
	if ((event.keyCode == Event.KEY_ESC) || (element.value.length == 0)) {
		f3_hide_ajax_dropdown();
		return;
	}
	/* strzalka w dol */
	else if (event.keyCode == Event.KEY_DOWN) {
		if (!ajax_schedule.visible) {
			return;
		}
		if (!ajax_schedule.selected) {
			ajax_schedule.selected = element.nextSibling.nextSibling.firstChild;
		}
		else {
			ajax_schedule.selected.firstChild.style.color = '';
			ajax_schedule.selected = ajax_schedule.selected.nextSibling ? ajax_schedule.selected.nextSibling : ajax_schedule.selected;
		}
		ajax_schedule.selected.firstChild.style.color = 'red';
		return;
	}
	/* strzalka w gore */
	else if (event.keyCode == Event.KEY_UP) {
		if (!ajax_schedule.visible || !ajax_schedule.selected) {
			return;
		}
		else {
			ajax_schedule.selected.firstChild.style.color = '';
			ajax_schedule.selected = ajax_schedule.selected.previousSibling ? ajax_schedule.selected.previousSibling : ajax_schedule.selected;
		}
		ajax_schedule.selected.firstChild.style.color = 'red';
		return;
	}
	/* strzalka w prawo - wybierz to, co jest zaznaczone */
	else if ((event.keyCode == Event.KEY_RIGHT) && ajax_schedule.visible && ajax_schedule.selected) {
		f3_fill_ajax_dropdown();
	}
	/* cos innego - wyswietl dropdown za pol sekundy */
	else {
		ajax_schedule.timeout = setTimeout('f3_ajax_dropdown(' + takeID + ')',500);
	}
}

// zakładamy, że - jeden po drugim! - są po kolei trzy elementy:
// input do wyszukiwania, input do wstawienia właściwej wartości,
// div do wstawienia listy wartości do wyboru

function f3_ajax_dropdown(takeID){
	
	var element = $(ajax_schedule.element);
	var url = ajax_schedule.url;
	
	var myAjax = new Ajax.Request(
		url,
					{
						method: 'post',
						asynchronous: false,
						parameters: (element.name + '=' + element.value.replace('/ /g', '%') + '&utf=1' + eval(element.nextSibling.className))
					}
		);
	var html = '';
	var xml = myAjax.transport.responseXML;
	
	/* bierzemy kolumny:
	var temp = xml.getElementsByTagName('columns')[0];
	var temp = xml.getElementsByTagName('column');
	var columns = new Array();
	for (var v=0; v < columns.length; v++){
		columns[] = column.childNodes[0].nodeValue;
	}
	*/

	var rows = xml.getElementsByTagName('row');
	for (var v = 0; v < rows.length; v++){
		var cols = rows[v].childNodes;
		var row = new Array();
		for (var r = 0; r < cols.length; r++){
			if (!cols[r].hasChildNodes()){
				continue;
			}
			
			row.push(cols[r].childNodes[0].nodeValue);
		}
		html += "<div class='ajax_dropdown_row'><a href='#wybierz' onclick='" +
			"ajax_schedule.selected = this.parentNode; f3_fill_ajax_dropdown(); return false'>"
			/*
			"this.parentNode.parentNode.previousSibling.value=this.nextSibling.className;" +
			"this.parentNode.parentNode.previousSibling.previousSibling.value=this.nextSibling.nextSibling.className;" +
			"this.parentNode.parentNode.style.display=\"none\"; this.parentNode.parentNode.innerHTML=\"\"; return false'> ";
			*/
		html += row[1].replace(); /* replace() ?! */
		html += "</a>";
		/* dwa divy, w ktorych przechowywane sa znalezione wartosci. paskudne rozwiazanie :o/ */
		html += "<div style='display:none' class='" + (takeID ? row[0] : row[1]) + "'></div>";
		html += "<div style='display:none' class='" + row[1] + "'></div>";
		html += "</div>";
	}

	if (html.length>0) {
		ajax_schedule.visible = true;
		element.nextSibling.nextSibling.style.display='';
	} else {
		ajax_schedule.visible = false;
		element.nextSibling.nextSibling.style.display='none';
	}
	element.nextSibling.nextSibling.innerHTML = html;
}

function f3_ajax_dropdown_stop_return(event) {
	if ((event.keyCode == Event.KEY_RETURN) && ajax_schedule.visible && ajax_schedule.selected) {
		f3_fill_ajax_dropdown();
		Event.stop(event);
	}
}

/* obsługa multiselecta (patrz: lib.inc, function extendmultiselect()) */
function f3_selectall(select) {
	$A(select.options).each(function (elem) { elem.selected = true; f3_element_changed(elem) })
}

function f3_deselectall(select) {
	$A(select.options).each(function (elem) { elem.selected = false; f3_element_changed(elem) })
}

function f3_flipall(select) {
	$A(select.options).each(function (elem) { elem.selected = !elem.selected; f3_element_changed(elem) })
}

/*
Local variables:
indent-tabs-mode: t
tab-width: 8
javascript-indent-level: 8
show-trailing-whitespace: nil
coding: utf-8
End:
*/

