var myAjax = {
	sendId: function(controller, action, ajax_id, p_options){
		if ( p_options == null ) p_options = {};
		var options = {
			id: '',
			controller: controller,
			action: action,
			ajax: {
				parameters: {
					id: ajax_id
				}
			}
		}
		options = Object.extend(options, p_options);
		//kérés sikere esetén
		var successFnc = function(id, transport){
			options.succesFnc(id, transport);
		};
		//kérés sikertelen esetén
		var failureFnc = function failureFnc(id, transport){
			if ( options.failureFnc != null ) {
				options.failureFnc(id, transport);
			} else {
				alert('Hiba a kapcsolódás során!');
			}
		};
		myAjax.request(options, successFnc, failureFnc);
	},
	loadId: function(id, controller, action, ajax_id, p_options){
		if ( p_options == null ) p_options = {};
		var options = {
			id: $(id).up().id,
			controller: controller,
			action: action,
			ajax: {
				parameters: {
					id: ajax_id
				}
			}
		}
		options = Object.extend(options, p_options);
		myAjax.updater(options);
	},
	loadForm: function(id, controller, action, form_id, p_options){
		if ( p_options == null ) p_options = {};
		var options = {
			id: $(id).up().id,
			controller: controller,
			action: action,
			form_id: form_id,
			ajax: {
				parameters: {}
			}
		}
		options = Object.extend(options, p_options);
		myAjax.updater(options);
	},
	updater: function(options){
		//Végrehajtja az ajax kérést
		var fnc = function(){
			//ha kell elötte valamit csinálni
			if ( options.before_function != null )
					options.before_function();
			//ha kell formot serializálni
			if ( options.form_id != null ){
				formdata = $(options.form_id).serialize(true);
				options.ajax.parameters = Object.extend(options.ajax.parameters, formdata);
			}
			//kérés sikere esetén
			var successFnc = function(id, transport){
				//ha változtatni akarok a válaszon
				if ( options.transport_function != null ) {
					options.transport_function(id, transport);
				}
				//eltünteti teszi a loading-div-et
				myAjax.hideEffect('myAjax-loading-div', function(){
					//elveszi a loding-div-et
					$('myAjax-loading-div').remove();
					//kiszámolja az új tartalom magasság át
					var dim = $(id).getDimensions();
					var newHeight = myAjax.getResponseHeight(dim.width, transport.responseText);
					//kinyújtja akkorára a div-et
					new Effect.Morph(id, {style: 'height: '+newHeight+'px;', duration: 0.5, afterFinish: function(){
					//beilleszti a választ
						$(id).update(transport.responseText);
					//visszaállítja az eredeti magasságot
						$(id).style.height = 'auto';
					//megjeleníti az új tartalmat
						myAjax.showEffect(id);
					//ha kell utólag csinálni valamit
						if ( options.after_function != null )
							options.after_function(transport.responseText);
					}});
				});
			};
			//kérés sikertelen esetén
			var failureFnc = function failureFnc(id, transport){
				myAjax.hideEffect('myAjax-loading-div', function(){
					$('myAjax-loading-div').remove();
					myAjax.showEffect(id, function(){
						alert('Hiba a kapcsolódás során!');
					});
				});
			};
			myAjax.request(options, successFnc, failureFnc);
		};

		//Ha kell megcsinálja az effektet
		if ( options.no_effect == true )
			fnc();
		else {
		//eltünteti a frissítendő divet
			myAjax.hideEffect(options.id, fnc, options);
		//létrehozza a loading div-et
			var loading_div = new Element('div', { id: 'myAjax-loading-div' });
		//kiszámolja a pozícióját
			var dim = $(options.id).getDimensions();
			loading_div.style.left = ((dim.width / 2) - 16) + 'px';
			loading_div.style.top = ((dim.height / 2) - 16) + 'px';
		//átlátszóvá teszi az animáció miatt
			loading_div.setOpacity(0);
		//majd beilleszti a dom-ba
			$(options.id).up().insert(loading_div);
		//és megjeleníti
			myAjax.showEffect(loading_div);
		}
	},
	request: function(options, successFnc, failureFnc){
		//elküldi a tényleges kérést
		var def_options = {
			method: 'post',
			onSuccess: function(transport){
				if ( transport.responseText.length > 0 ) {
					after_id = transport.getHeader("UpdateDivId");
					if ( after_id == "window" ){
						document.location.href = document.location.href;
						return;
					}
					if ( after_id != null ) {
						options.id = after_id;
					}
					successFnc(options.id, transport);
				} else {
					failureFnc(options.id, transport);
				}
			},
			onFailure: function(transport){
				failureFnc(options.id, transport);
			}
		}
		options.ajax = Object.extend(def_options, options.ajax);
		new Ajax.Request("/index.php/"+options.controller+"/"+options.action, options.ajax);
	},
	hideEffect: function(id, after_fnc){
		//ha a szülő nem relatív, akkor azzá teszi
		if ( $(id).up().style.position != "relative" ){
			$(id).up().style.position = "relative";
		}
		//eltönteti a div-et
		Effect.Appear(id, {duration: 0.6, from: 1, to: 0.00001, afterFinish: function(){
			after_fnc();
		}});
	},
	showEffect: function(id, after_fnc){
		//megjeleníti a div-et
		Effect.Appear(id, {duration: 0.6, from: 0.00001, to: 1, afterFinish: function(){
			if ( after_fnc != null )
				after_fnc();
		}});
	},
	getResponseHeight: function(width, responseText){
		var test_div = new Element('div', { id: 'myAjax-test-div' });
		test_div.style.width = width+'px';
		test_div.update(responseText);
		var objBody = $$('body')[0];
		objBody.insert(test_div);
		var dim = test_div.getDimensions();
		test_div.remove();
		return dim.height;
	}
}
