// формы с выводом сообщений
activeElements.add( 'form.ajax_n_flash', function(){
	this.flashRequest();
});

// формы с выводом сообщений
activeElements.add( 'a.ajax_n_flash', function(){
	
	var request = new Request.FLASH({
		'url': this.get('href'),
		'method': 'post',
		'onComplete': function(){
			
		},
		'onFailure': function(){
			
		},
		'onSuccess': function( json, text){
			
		}
	});
	
	
	this.addEvent('click', function(e){
		e.stop();
		request.send();
	});
	
});


Native.implement([Element], {
	
	flashRequest: function(){
		
		var form = $(this);
		
		// события
		if( form.get('onSuccess') ){
			form.addEvent('success', function(json, text){
				eval(form.get('onSuccess'));
			});
		}
		if( form.get('onFailure') ){
			form.addEvent('failure', function(){
				eval(form.get('onFailure'));
			});
		}
		
		var submit_btn = form.getElements('[type=submit]');
		
		
		var params = new Hash({
			'url': form.get('action'),
			'method': form.get('method'),
			'data': this,
			'onComplete': function(){
				if( $('captcha') ){
					var myDate = new Date();
					$('captcha').getElement('img').set('src', $('captcha').getElement('img').get('src').replace(/\?(.*?)$/, '') + '?'+myDate.getTime());
				}
				
				if(submit_btn && submit_btn.length != 0)
					submit_btn.set('disabled', false)
			},
			'onFailure': function(){
				form.fireEvent('failure');
			},
			'onSuccess': function( json, text){
				form.fireEvent('success', json, text);
				
				
				// закрываем popup окошко, если форма в нем
				if( form.getParent('.lightbox') && form.get('closelightbox') == 'yes' ){
					form.getParent('.lightbox').getElement('.close').fireEvent('click');
				}
				
				
				// редиректимся если надо
				if( json.redirect_url && form.get('redirect') == 'yes'){
					window.location.href = json.redirect_url;
				}
				
				
			}
		});
		
		// запрос
		if( form.get('enctype') == 'multipart/form-data' ){
			
			var request = new Request.IFRAME( form, params );
			
		}
		else{
			var request = new Request.FLASH( params );
			
			form.addEvent('submit', function(e){
				e.stop();
				request.send();
			});
		}
		
		
		form.addEvent('submit', function(e){
			if(submit_btn && submit_btn.length != 0)
				submit_btn.set('disabled', true)
		});
		
	}
	
});


// Запрос, для форм с entype = 'multipart/form-data' 
Request.IFRAME = new Class({
	
	Implements: [Chain, Events, Options],
	
	
	options: {
		
	},
	
	initialize: function(form, options){
		this.setOptions(options);
		
		var formname = (form.get('id')) ? form.get('id') : form.get('name');
		
		new Element('input', {
			'type': 'hidden',
			'name': 'HTTP_X_REQUESTED_WITH',
			'value': 'IFrameHttpRequest'
		}).inject( form );
		
		new Element('input', {
			'type': 'hidden',
			'name': 'HTTP_X_REQUEST',
			'value': 'JSON'
		}).inject( form );
		
		
		var $this = this;
		this.iframe = new IFrame({
			'id': formname+'_iframe',
			'name': formname+'_iframe',
			
			'src': 'about:blank',
			
			'rel': '',
			
			'styles': {
				'width': '100%',
				'height': '100px',
				'border': 'none',
				'display': 'none'
			},
			
			'events': {
				
				load: function(){
					if(!this.get('rel') || this.get('rel') == '')
						return;
					
					var responseText = this.contentWindow.document.body.innerHTML;
					
					if(responseText){
						$this.success( responseText );
					}
					else
						Flash.error( 'Нет ответа' );
				}
				
			}
			
		}).inject( document.body );
		
		
		form.set('target', formname+'_iframe');
		
		form.addEvent('submit', function(e){
			//if(e) e.stop();
			
			if(LOADING.inProcess){
				Flash.notice( 'Подождите' );
				if(e) e.stop();
				return false;
			}
			
			$this.iframe.set('rel', 'fromform');
			
			$this.send();
		});
	},
	
	send: function(){
		
		this.fireEvent('onRequest');
		
		if(Flash)
			Flash.empty();
		if(LOADING){
			LOADING.start();
			
			this.addEvent('complete', function(){
				LOADING.stop();
			});
		}
	},
	
	
	success: function(text, xml){
		var secure = this.options.secure;
		var json = Function.attempt(function(){
			return JSON.decode(text, secure);
		});

		if (json == null){
			this.onFailure();
		}
		else if( json.flash && json.flash.messages ){
			// запускаем сообщения
			Flash.fire( json.flash.messages );
			
			// если есть ошибки, то onFailure
			if(json.flash.count.errors > 0)
				this.onFailure();
			else
				this.onSuccess(json, text);
		}
		else{
			this.onSuccess(json, text);
		}
	},

	onSuccess: function(){
		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
	},

	failure: function(){
		this.onFailure();
	},

	onFailure: function(){
		this.fireEvent('complete').fireEvent('failure', this.xhr);
	},
	
	
	
	
	iframeSubmitEvent: function(ignoreinputs, nosuccmsg){
		var form = this;
		
		var formname = (this.get('id')) ? this.get('id') : this.get('name');
		
		new Element('input',{
			'type':'hidden',
			'name': 'json',
			'value': '1'
		}).inject(this);
		
		var sbmt_btn = form.getElement('input[type=submit]');
		
		
		var formIFrame = new IFrame({
			
			id: formname+'_iframe',
			
			name: formname+'_iframe',
			
			src: 'about:blank',
			
			rel: '',
			
			styles: {
				width: '100%',
				height: 300,
				border: 'none',
				'display': 'none'
			},
			
			events: {
				
				load: function(){
					if(!this.get('rel') || this.get('rel') == '') return;
					
					form.fireEvent('onComplete');
					LOADING.stop();
					
					if(sbmt_btn)
						sbmt_btn.set('disabled', false);
					
					var resJSON = this.contentWindow.document.body.innerHTML;
					
					if(resJSON){
						form.fireEvent('getRes', resJSON);
						var res_arr = JSON.decode(resJSON);
						
						if(res_arr.errors && res_arr.errors != '')
							fireErrors(res_arr.errors, ignoreinputs);
						else if(res_arr.status == 'ok'){
							form.fireEvent('success', res_arr);
							if(!nosuccmsg)
								newCast({'text':res_arr.ok}).castFire();
						}
					}
					else
						newCast({'type':'error', 'text':'no Answer'}).castFire(1000);
				}
				
			}
        	
		}).injectAfter(this);
		
		
		this.set('target', formname+'_iframe');
		
		this.addEvent('submit', function(e){
			//if(e) e.stop();
			
			if(LOADING.inProcess){
				newCast({'type':'error', 'text':'Please, wait'}).castFire(1000);
				if(e) e.stop();
				return false;
			}
			
			if(sbmt_btn)
				sbmt_btn.set('disabled', true);
				
			formIFrame.set('rel', 'fromform');
			
			form.fireEvent('onRequest');
			LOADING.start();
			$$('.error_cast').castDestroy();
			$$('.ok_cast').castDestroy();
			
			this.fireEvent('prepareForm')//.send();
			
			//this.submit();
			
		});
		
		return this;
	}
	
});





// Запрос, который благодаря JSON выводит все сообщения для пользователя
Request.FLASH = new Class({

	Extends: Request.JSON,
	
	options: {
		
	},
	
	send: function(options){
		this.parent(options);
		
		if(Flash)
			Flash.empty();
		if(LOADING){
			LOADING.start();
			
			this.addEvent('complete', function(){
				LOADING.stop();
			});
		}
		
	},
	
	success: function( text ){
		var secure = this.options.secure;
		var json = this.response.json = Function.attempt(function(){
			return JSON.decode(text, secure);
		});

		if (json == null){
			this.onFailure();
		}
		else if( json.flash && json.flash.messages ){
			// запускаем сообщения
			Flash.fire( json.flash.messages );
			
			// если есть ошибки, то onFailure
			if(json.flash.count.errors > 0)
				this.onFailure();
			else
				this.onSuccess(json, text);
		}
		else{
			this.onSuccess(json, text);
		}
		
	}

});

