var FormManager = Class.create({
	
	/* Ustawiane sa wrappery na metody wywolywane przez Eventy ustawione na obiektach HTML formularza.
	*/
	initialize: function() {
		this.submitF = this.submitForm.bindAsEventListener(this);
		this.resetF = this.resetForm.bindAsEventListener(this);
		this.hideFC = this.hideformContainer.bindAsEventListener(this);
	},

	/* Metoda ustawia obsluge Eventow na interaktywnych obiektach HTML formularza.
	*/
	setEventHandlers: function(status) {

		//Event.observe($('formOverlay'), 'click', fm.hideFC);

		if ($('formCancel') == null)
			Event.observe($('formReset'), 'click', fm.resetF);
		else
			Event.observe($('formCancel'), 'click', fm.hideFC);
			
		Event.observe($('formClose'), 'click', fm.hideFC);
		Event.observe($('formSubmit'), 'click', fm.submitF);
	},
	
	/* Metoda zdejmuje obsluge Eventow na interaktywnych obiektach HTML formularza.
	*/
	unsetEventHandlers: function(status) {
		
		//Event.stopObserving($('formOverlay'), 'click', fm.hideFC);
		
		$$('img.button').each(function (element) {
			if (element.identify() == 'formCancel')
			{
				Event.stopObserving(element, 'click', fm.hideFC);
			}
			else if (element.identify() == 'formReset')
			{
				Event.stopObserving($('formReset'), 'click', fm.resetF);
			}
		});
		
		Event.stopObserving($('formClose'), 'click', fm.hideFC);
		Event.stopObserving($('formSubmit'), 'click', fm.submitF);
	},
	
	/* 	submitForm: (26-11-08)
		Podstawowym zadaniem funkcji jest wykonanie procedur poprzedzajacych wykonanie eventu SUBMIT na wysylanych formularzach.
		Jesli wszystko przebiegnie bezblednie, wywolywana jest funkcja fm.processRequest, ktora realizuje przekazanie oraz odbior danych do i z Processora.
		
		1. Deaktywacja eventow przypisanych do interfejsu formularza (np. przyciski 'Submit' czy 'Reset')
		2. Wylacz wszystkie wysiwgowe kontrolki formularza
		3. Skopiuj HTMLelement formularza do zmiennej 'element' i odczytaj wartosci przypisanych atrybutow:
			- action, informacja o rodzaju zapytania, ktore zostanie przekazana do Processora
			- recID, tylko gdy dane formularza dotycza juz istniejacego rekordu, informacja o ID rekordu, ktore zostanie przekazana do Processora
			- table, informacja o nazwie tablicy w bazie, ktora zostanie przekazana do Processora
		4. Przeprowadz walidacje pol formularza 'editForm' (kazdy formularz, obslugiwany przez uzytkownika ma id='editForm')
		5. Jesli do formularza dolaczony jest formularz dodawania plikow 'editFilesForm', dokonaj jej walidacji
		6. Sprawdz wyniki walidacji, jesli ktorykolwiek z formularzy zwrocil false, wykonaj co nastepuje:
			- Aktywuj eventy przypisane do interfejsu formularza
			- Wlacz wszystkie wyswigowe kontrolki formularza
		7. Jesli walidacja przebiegla pomyslnie, wywolaj fm.processRequest i przekaz: 'action','recID','table'.
		
		# TODO
		# wartosc zmiennej 'table' pochodzi wprost z atrybutu taga, do ktorego przyczepiono event odpalajacy submitForm()
		# jest to potencjala dziura w zabezpieczeniach, do usuniecia
	*/
	submitForm: function(event) {
		
		fm.unsetEventHandlers();
				
		tools.wyswigControl('turnOff');
		
		var element = Event.element(event);
		
		this.action = element.readAttribute('action');
		this.recID = element.readAttribute('recID');
		this.table = element.readAttribute('table');
		
		var valid = new Validation('editForm', {onSubmit:true});
		var result = valid.validate();
		
		var resultFiles = true;
		
//		if ($('editFilesForm')) {
//			var validFiles = new Validation('editFilesForm', {onSubmit:true});
//			var resultFiles = validFiles.validate();
//		}

		if (!result) { //|| !resultFiles) {
			fm.setEventHandlers();
			tools.wyswigControl('turnOn');	
		}
		else {
			fm.processRequest(this.action,this.recID,this.table);
		}
	},
	
	submitFilesForm: function() {
		
		fm.unsetEventHandlers();
		
		var validFiles = new Validation('editFilesForm', {onSubmit:true});
		var resultFiles = validFiles.validate();
		
		if (!resultFiles) {
			fm.setEventHandlers();
		}
		else {
			$('editFilesForm').submit();
			$('editFormFilesStatus').update(mm.getStatusMsg('loaderFile'));
			$('editFilesForm').disable();
			$('formFilesSubmit').setAttribute('onClick','');
			$('formFilesCancel').setAttribute('onClick','');
		}
	},
		
	/* Metoda ogolnego przeznaczenia, ktora powinna umozliwic przetwarzanie danych z dowolnych obiektow HTML o id 'editForm'.
	   Informacje o procesorze, ktory zajmie sie przetwarzaniem danych zawarte sa w samym formularzu, w atrybucie action obiektu HTML <form>.
	   Metoda kontaktuje sie ze wskazanym procesorem (najczesciej FormProcessor) i odbiera wynik dzialania uruchomionej w nim procedury, wybranej na podstawie wartosci zmiennej 'action'.
	   Obslugiwane odpowiedzi procesora:
	   True    - jesli efekt wykonania porcedury byl poprawny
	   True01  - wykorzystywany jesli istnieja dwa rozne efekty koncowe poprawnego wykonania procedur w procesorze
	   False   - jesli efekt wykonania porcedury byl niepoprawny
	   Error01 - jesli efekt wykonania procedury byl niepoprawny i spowodowal blad
	   Error02 - jesli efekt wykonania procedury byl niepoprawny i spowodowal blad
	   Error03 - jesli efekt wykonania procedury byl niepoprawny i spowodowal blad
	   W zaleznosci od otrzymanej odpowiedzi, wykonywany jest okreslony ciag polecen. 
	   Tworzona zmienna dataMsg jest przekazywana do MessageManagera w celu zworcenia komunikatu specyficznego dla danej akcji i jej odpowiedzi.
	*/
	
	processRequest: function(action, recID, table) {
		
		$('editForm').request({
			parameters: { action:action, recID:recID, table:table },
		
			onCreate: function() {
				$('editForm').disable();
				$('editFormStatus').update(mm.getStatusMsg('loader'));
			},
			
			onComplete: function(transport) {
				try {
					var objProcMsg = (transport.responseText).evalJSON(true);

					if (objProcMsg.msgBool) {
						//if ($('editForm').getAttribute('userfiles') == 'false') {
							$('formContainer').down('h3').style.textAlign = 'center';
							$('formContainer').down('h3').update(mm.getStatusMsg(objProcMsg.msgCode));
						//}
						
						switch (action) {
							case 'modUser':
							case 'modUserPassword':
								tools.sickLogout(); break;
							
							case 'delRecord':
							case 'addRecord':
							case 'addBlobRecord':
							case 'modRecord':
							case 'delUser':
							case 'notifyUser':
							case 'activateUser':
							case 'adminUser':
								tools.reloadInterface(); break;
						}
					}
					else if (!objProcMsg.msgBool) {
						$('editFormStatus').update(mm.getStatusMsg(objProcMsg.msgCode));
						
						$('editForm').enable();
						fm.setEventHandlers();
					}
					else
					 $('editFormStatus').update(mm.getStatusMsg('unknownError'));
				}
				catch (error) {
					alert('Script encountered an error: '+error);
				}
				finally {
//					if (objProcMsg.msgBool && ($('editForm').getAttribute('userfiles') == 'true')) {
//						$('editFilesForm').submit();
//						$('editFilesForm').disable();
//						$('editFormStatus').update(mm.getStatusMsg('loaderFile'));
//					}
//					else {
//						if ($('editFilesForm'))
//							$('editFilesForm').hide();
						
						$('editForm').hide();
						$('editForm').enable();
						fm.setEventHandlers();
//					}
				}
			}
		});
	},
	
	
	/* Metoda wywolywana tylko przez zdarzenia typu Event uruchamiane na obiektach HTML.
	   Wykorzystywana wszedzie tam, gdzie w reakcji na akcje uzytkownika konieczne jest wyswietlenie jakiegos formularza.
	   W pierwszej kolejnosci zbiera wartosci atrybutow obiektu HTML, z ktorego ja wywolano, zmieniajac je na trzy zmienne: 
	   action - decyduje o tym jaka procedura w ramach FormProcessora ma byc wykonana
	   recID  - id rekordu w bazie ktorego dotyczy wywolywana procedura FormProcessora
	   table  - tablica rekordu w bazie ktorego dotyczy wywolywana procedura FormProcessora
	   Nastepnie wola metode setFormContainer(), przekazujac do niej trzy zmienne.
	   Na koncu ustalany jest rozmiar obiektow HTML (formOverlay i formContainer), ktore pokazywane sa uzytkownikowi.
	*/
	showFormContainer: function(event) {
		
		Event.stop(event);
		
		var element = Event.element(event);

		this.action = element.readAttribute('action');
		this.recID = element.readAttribute('recID');
		this.table = element.readAttribute('table');

		fm.setFormContainer(this.action,this.recID,this.table);
		
		if (this.action=='UpRecord'||this.action=='DownRecord')
			return;
		
		arrayPageSize = tools.getPageSize(this.action,this.recID,this.table);
			
			$('formOverlay').style.height = arrayPageSize[1] + 1250 + 'px';
			$('formContainer').style.left = ((arrayPageSize[0] - 640) / 2) + 'px';
		
			$('formOverlay').show();
			$('formContainer').show();
	},
	
	/* Metoda ukrywajaca obiekty HTML formOverlay i formContainer, do ktorych zaladowana jest tresc zwrocona przez FormProcessor.
	*/
	hideformContainer: function() {
		tools.wyswigControl('turnOff');
		$('formOverlay').hide();
		$('formContainer').update('');
		$('formContainer').style.backgroundColor = 'transparent';
	},
	
	/* Metoda resetujaca formularz 'editForm'.
	   Dodatkowo resetuje tez pola podpowiedzi obiektu Validation.
	*/
	resetForm: function() {
		
		var valid = new Validation('editForm', {onSubmit:true});
		valid.reset();
		$('editForm').reset();
		
		if ($('editFilesForm') != 'null')
		{
			var validFiles = new Validation('editFilesForm', {onSubmit:true});
			validFiles.reset();
			$('editFilesForm').reset();
		}
		
		$('editFormStatus').update('');
	},
	
	/* Metoda kontaktuje sie z FormProcessorem, ktory zwraca HTML formularza wybrany na podstawie wartosci zmiennej 'action'.
	   Nastepnie wykonuje metode reset() na obiekcie HTML 'editForm', o ile ten zostal przekazany z FormProcessora.
	   Na koncu uruchamiania jest metoda setEventHandlers(), ktora przypisuje wybranym obiektom HTML Eventy obslugujace interfejs formularza.
	*/
	setFormContainer: function(action, recID, table) {
		//alert(action);
		new Ajax.Request('php/FormProcessor.php', {
			
			method: 'post',
			parameters: { action:action, recID:recID, table:table },
			
			onCreate: function() {
				$('formContainer').update('');
			},
			
			onComplete: function(transport) {
				if (action=='UpRecord'||action=='DownRecord') {
					var objProcMsg = (transport.responseText).evalJSON(true);
					if (objProcMsg.msgBool)
						tools.reloadInterface();
					else
						$('interfaceStatus').update('Error on action: '+action);
					}
				else {
					$('formContainer').style.backgroundColor = '#fff';
					$('formContainer').update(transport.responseText.strip().replace(/\r\n/g,''));
					if ($('editForm') != null)
						$('editForm').reset();
					fm.setEventHandlers();
					}
			}
		});
	}

});

