
var formConfirmed = false;
var formCanceled = false;


var Form = new Class({
	Implements: Options,
	
	name: '',
	loader: {bg: null, wait: null},
	options: {
		action: '',
		method: 'post',
		enctype: 'text/plain',
		onConfirm: null,
		onFailure: function(err) {
			new MooPop('Błąd formularza!','Skrypt formularza napotkał podczas wykonywania zapytania na nieoczekiwany błąd. Komunikat błędu: '+err+'.',{drag: true, opacity: .5, type: 'error'});
		},
		onResponse: function(response) {
			new MooPop(response.header,response.msg,{drag: true, opacity: .5, action: response.action, type: response.type});
		},
		waitText: 'Proszę czekać...',
		timed: false,
		decode: true,
		wait: 60000 // minutę
	},
	initialize: function(name,options) {
		if (name=='' || $type(name)!='string') return false;
		
		// Nazwa formularza (jednocześnie jego id)
		this.name = name;
		
		// Ustawiamy opcje
		this.setOptions(options);
	},
	create: function() {
		
		if (!$(this.name) && this.options.timed==false) {
			//new MooPop('Błąd formularza!','Nie istnieje formularz o podanym id \''+this.name+'\'.',{drag: true, opacity: .5, type: 'error'});
			return false;
		}
		
		$(this.name).addEvent('submit',function(e) {
			new Event(e).stop();
			
			if (this.options.action=='' && !Browser.Engine.trident) {
				this.options.action = $(this.name).get('action');
			}
			
			switch($type(this.options.onConfirm)) {
				case 'function':
					formConfirmed = false;
					formCanceled = false;
					
					this.options.onConfirm();
					
					var timer = setInterval(function() {
						if (formConfirmed==true) {
							formConfirmed = false;
							timer = clearInterval(timer);
							this.request();
						}
						if (formConfirmed==true || formCanceled==true) {
							timer = clearInterval(timer);
						}
					}.bind(this),50);
					break;
				default:
					this.request();
					break;
			}
			
		}.bind(this));
	},
	createLoader: function() {

		this.destroyLoader();
		
		var screen = getScrollSize();
		
		this.loader.bg = new Element('div',{
			'id': 'wait-bg',
			'styles': {
				'height': screen.y+'px',
				'width': screen.x+'px'
			}
		}).injectInside(document.body);
		
		this.loader.wait = new Element('div',{
			'id': 'f-wait',
			'class': 'f-wait'
		}).injectAfter(this.loader.bg);
		
		var loader = new Element('img',{
			'src': imagesPath+'loader-small.gif', 
			'alt': ''
		}).injectInside(this.loader.wait);
		
		var loaderText = new Element('span',{ 
			'html': '&nbsp;'+this.options.waitText
		}).injectInside(this.loader.wait);
		
		var scroll = getScroll();
		var window = getSize();
		var size = this.loader.wait.getSize();
		
		this.loader.wait.setStyles({
			'top': (scroll.y+window.y/2-size.y/2-100)+'px',
			'left': (scroll.x+window.x/2-size.x/2)+'px'
		});
	},
	destroyLoader: function() {
		if ($('wait-bg')) {
			$('wait-bg').destroy();
		}
		if ($('f-wait')) {
			$('f-wait').destroy();
		}
	},
	responseHandle: function(response) {
		// Pusta odpowiedź
		if (response=='') {
			new MooPop('Błąd formularza!','Wystąpił błąd podczas wysyłania formularza. Nie otrzymano odpowiedzi.',{drag: true, opacity: .5, type: 'error'});
			return false;
		}
		
		try {
			var r = null;
			
			if (this.options.decode==true) {
				r = JSON.decode(response);
				if ($type(r)!='object') return false;
			} else {
				r = response;
			}
			
			this.options.onResponse(r);
		} catch(e) {
			new MooPop('Błąd formularza!','Wystąpił błąd podczas wysyłania formularza. Komunikat błędu: '+e+'. Odpowiedź: '+response+'. Skontaktuj się z administratorem Twojej strony.',{drag: true, opacity: .5, type: 'error'});
		}
	},
	request: function() {
		
		/**
		 * Loader formularza
		 * ------------------------------------------------------------
		 */
		this.createLoader();
		/**
		 * Update pól wszystkich FCK na stronie
		 */
		if ($defined(updateFCK)) updateFCK();
		
		var f = $(this.name);
		var action = f.get('action');
		var method = f.get('method');
		var enctype = f.get('enctype');
		
		if (enctype=='multipart/form-data') {
			var iframe = new Element('iframe',{
				'id': 'form-frame',
				'name': 'form-frame',
				'src': action,
				'styles': {
					'display': 'none'
				}
			}).injectInside(document.body);
			f.set('target','form-frame');
			f.submit();
			
			var time = $time();
			var timer = (function() {
				var frame = $('form-frame');
				var d;
				if (frame.contentDocument) {
					d = frame.contentDocument;
				} else if (frame.contentWindow) {
					d = frame.contentWindow.document;
				} else {
					d = window.frames['form-frame'].document;
				}

				if ($(d.body)) {
					var response = $(d.body).get('html');
					
					if (response!=null) {
						if (response!='' || $time()>(time+this.options.wait)) {
							// Stop timera
							$clear(timer);
							// Usuwanie ramki
							$('form-frame').destroy();
							// Usuwanie loadera
							this.destroyLoader();
							// Obsługa odpowiedzi
							if (response!=null) this.responseHandle(response);
						}
					}
				}
			}.bind(this)).periodical(10);
			
		} else {
			
			f.set('send',{
				url: action!=''?action:this.options.action,
				method: method!=''?method:this.options.method,
				enctype: enctype!=''?enctype:this.options.enctype,
				onFailure: function(err) {
					// Usuwanie loadera
					this.destroyLoader();
					this.options.onFailure(err);
				}.bind(this),
				onSuccess: function(responseText) {
					
					// Usuwanie loadera
					this.destroyLoader();
					// Obsługa odpowiedzi
					this.responseHandle(responseText);
				}.bind(this)
			}).send();
		}
	}
});
