function ajaxFunction(url, parameters, result_id, callback_function, callback_parameters, result_alert, track) {
	if (parameters == null) {
		parameters = new Hash();
	}
	if (!Object.isHash(parameters)) {
		parameters = new Hash(parameters);
	}

	parameters.set('ajax', true);
	if (result_id != null) {
		parameters.set('element_id', result_id);
	}


	var busy_element_id = parameters.get('busy_indicator_element');
	var busy_element = null;
	if (busy_element_id != null) {
		busy_element = $(busy_element_id);
		showElement(busy_element);
	}
	
	var indicator_element_id = parameters.get('ajax_indicator_element');
	var indicator_element = null;
	var indicator_layer = null;
	var morph = parameters.get('morph_indicator_element');
	if (indicator_element_id != null) {
		var indicator_element = $(indicator_element_id);
		if (indicator_element != null) {
			indicator_layer = setElementToBusy(indicator_element);
		}
	}
	parameters.unset('ajax_indicator_element');
	parameters.unset('morph_indicator_element');


	new Ajax.Request(url, {
		method: 'post',
		parameters: parameters.toObject(),
		onComplete: function(response) {
			var tmp_parameters = callback_parameters;
			var callback_function_mode = 'script';
			var tmp_response = '';
			var tmp_response_obj = null;

			if (response.responseText.substring(0,1) == '{') {
				var tmp_response_obj = new Hash(response.responseText.evalJSON(true));
				if (tmp_response_obj.get("timeoutError") != null) {
					alert(getLangValue('js', 'timeout_error'));
					parent.window.location = 'index.php';
					return false;
				} else if (tmp_response_obj.get("accessError") != null) {
					alert(getLangValue('js', 'access_error'));
					parent.window.location = BASEURL + 'index.php';
					return false;
				}

				var tmp_result = new Hash(tmp_response_obj.get('result'));
				if (tmp_result.get('text') != null) {
					tmp_response = tmp_result.get('text');
				}
				if (tmp_result.get('callback_parameters') != null) {
					tmp_parameters = new Hash(tmp_result.get('callback_parameters'));
					callback_function_mode = 'function';
				}
			} else {
				tmp_response = response.responseText;
			}
			
			if (result_id != null) {
				var element = $(result_id);
				if (element != null) {
					if (morph == true) {
						morphContent(element, tmp_response, indicator_element, indicator_layer);
					} else {
						if (indicator_element != null) {
							setElementToIdle(indicator_element);
						}
						element.update(tmp_response);
						stylePage();
					}
				} else {
					debug('Result element "' + result_id + '" not found.');
				}
			}

			if (busy_element != null) {
				hideElement(busy_element);
			}

			if (result_alert != null) {
				if ((tmp_response_obj != null) && (tmp_response_obj.get('success') == true)) {
					alert(result_alert);
				} else {
					alert(result_alert);
				}
			}

			if (callback_function != null) {
				if (typeof callback_function == 'function') {
					callback_function(tmp_response_obj);
				} else {
					if (typeof window[callback_function] == "function") {
						if (callback_function_mode == 'script') {
							executeFunction(callback_function, tmp_parameters);
						} else {
							window[callback_function](tmp_parameters);
						}
					} else {
						debug('Callback function "' + callback_function + '" not found.');
					}
				}
			}

			return true;
		},
		onFailure:  function(response) {
			debugAjax('<span class="bold">Failure: "' + url + '"</span><br />Status: "' + response.status + '"<br />Text: "' + response.statusText + '"');

			if (indicator_element != null) {
				setElementToIdle(indicator_element);
			}

			if (busy_element != null) {
				hideElement(busy_element);
			}

			return false;
		}
	});

	debugAjax('<span class="bold">URL: "' + url + '"</span><br />Parameters: ' + parameters.toJSON() + '<br />Callback: ' + callback_function + '(' + callback_parameters + ')');

	return false;
}

function loadContent(url, result_id, parameters) {
	ajaxFunction(url, parameters, result_id);
}

function updateSession(key, value, callback_function, callback_parameters, result_alert) {
	var parameters = generateSessionParameters(key, value);
	
	debug('Update session: ' + parameters.toJSON());

	return ajaxFunction(BASEURL + 'actions/updateSession.php', parameters, null, callback_function, callback_parameters, result_alert);
}

function saveUserSettings(key, value, in_session, callback_function, callback_parameters, result_alert) {
	var parameters = generateSessionParameters(key, value);
	parameters.set('in_session', in_session);

	debug('Update user settings: ' + parameters.toJSON());

	return ajaxFunction(BASEURL + 'actions/saveUserSettings.php', parameters, null, callback_function, callback_parameters, result_alert);
}

function generateSessionParameters(key, value) {
	var parameters = new Hash();
	parameters.set('key', key);

	if (!(Object.isString(value) || Object.isNumber(value) || Object.isHash(value) || Object.isArray(value))) {
		value = new Hash(value);
	}
	if (Object.isHash(value) || Object.isArray(value)) {
		value = value.toJSON();
	}

	parameters.set('json_value', value);

	return parameters;
}

function submitData(showTab, ideaid, save) {
	var parameters = new Hash();

	ing_num = jQuery('#id_rcount').val();
	buffer='';
	for(i=0;i<ing_num;i++) {
		if(jQuery('#id_qty_'+i).val()!='' || jQuery('#id_unit_'+i).val()!='' || jQuery('#id_ing_'+i).val()!='') {
			buffer = buffer + jQuery('#id_qty_'+i).val() + '::##::' + jQuery('#id_unit_'+i).val() + '::##::' + jQuery('#id_ing_'+i).val() + "\n"; 
		}
	}
	jQuery('#id_description').val(buffer);

	var text_errors = false;
	var data_elements = $$('textarea.submitdata, input.submitdata');
	data_elements.each(function(item) {
		parameters.set(item.name, item.value);
		if (item.hasClassName('mandatory') && (item.value.length == 0)) {
			text_errors = true;
		}
	});

	
	var categories_inputs = $$('input[name="categories[]"]');
	var categories = new Array();
	categories_inputs.each(function(item) {
		if (item.checked) {
			categories.push(item.value);
		}
	});
	parameters.set('categories[]', categories);

	//if(categories.length==0) {
	//	alert('Please choose your category!');
	//	return false;
	//}
	
	if (text_errors) {
		showErrorFields();
		return false;
	}


	// self evaluation
	var eval_form = $$('form#enteridea-form-eval').first();
	if (eval_form != null) {
		var evalCnt = $("evalcnt").value;

		parameters.set('selfeval', 1);
		parameters.set('evalcnt', evalCnt);
		for (var i=1; i<=evalCnt; i++) {
			var val = $("eval_val"+i);
			var key = $("eval_key"+i);
			if (val != null) {
				if (key != null) {
					parameters.set('evalval'+i, val.value);
					parameters.set('evalkey'+i, key.value);
				}
			}
		}
	}


	parameters.set('tabname', 'enteridea');
	parameters.set('tab', showTab);
	parameters.set('cfi', $('cfi').value);
	parameters.set('xsrf', $('xsrf').value);


	if (save) {
		parameters.set('save', 1);
		var callback_function = 'completeSavingIdea';
		var callback_function = function() {
			loadPage('enterIdeaThankYou.php');
		}
	} else {
		parameters.set('save', 0);
		var callback_function = 'completeSavingDraftIdea';
	}

	return ajaxFunction(BASEURL + 'actions/storeIdea.php', parameters, null, callback_function);
}

function delMainImage(ideaid, imageName) {
	if (confirm(unescape("Wollen Sie wirklich das Hauptbild l%F6schen?"))) {
		var parameters = new Hash();
		parameters.set('ideaid', ideaid);
		parameters.set('filename', imageName);
		parameters.set('delmain', true);

		var alert_string = unescape("Um das Bild endg%FCltig zu l%F6schen, speichern Sie bitte Ihre Idee ab.");

		ajaxFunction(BASEURL + 'enterIdeaAttachments.php', parameters, "enterIdeaAttachment", null, null, alert_string);

		main_img_flag = false;
	}
}

function delImage(ideaid, imageName) {
	if (confirm(unescape("Wollen Sie wirklich das Bild l%F6schen?"))) {
		var parameters = new Hash();
		parameters.set('ideaid', ideaid);
		parameters.set('filename', imageName);
		parameters.set('delimage', true);

		var alert_string = unescape("Um das Bild endg%FCltig zu l%F6schen, speichern Sie bitte Ihre Idee ab.");
		
		ajaxFunction(BASEURL + 'enterIdeaAttachments2.php', parameters, "enterIdeaAttachment2", null, null, alert_string);
	}
}

function delFile(ideaid, imageName) {
	if (confirm(unescape("Wollen Sie wirklich die Datei l%F6schen?"))) {
		var parameters = new Hash();
		parameters.set('ideaid', ideaid);
		parameters.set('filename', imageName);
		parameters.set('delfile', true);

		var alert_string = unescape("Um die Datei endg%FCltig zu l%F6schen, speichern Sie bitte Ihre Idee ab.");
		
		ajaxFunction(BASEURL + 'enterIdeaAttachments2.php', parameters ,"enterIdeaAttachment2", null, null, alert_string);
	}
}


function delCommentStore(id) {
	var parameters = new Hash();
	parameters.set('id', id);
	
	ajaxFunction(BASEURL + 'actions/delComment.php', parameters);
}

function updateUpload(ideaid, isMainImage) {
	if (isMainImage) {
		main_img_flag = true;
	}

	ideaid_input_element = $('enteridea-id');
	if (ideaid_input_element != null) {
		if (ideaid_input_element.value == 0) {
			ideaid_input_element.value = ideaid;
		}
	}

	var parameters = new Hash();
	parameters.set('ideaid', ideaid);

	if (isMainImage) {
		ajaxFunction(BASEURL + 'enterIdeaAttachments.php', parameters, 'enterIdeaAttachment');
	} else {
		ajaxFunction(BASEURL + 'enterIdeaAttachments2.php', parameters, 'enterIdeaAttachment2');
	}
}

function ideaAddToFavs(element, userid, ideaid) {
	var parameters = new Hash();
	parameters.set('userid', userid);
	parameters.set('ideaid', ideaid);
	
	ajaxFunction(BASEURL + 'actions/favouritesAdd.php', parameters, null, function() {
		var from = jQuery(element).closest('div.idea-container').eq(0);
		if (from.size() == 0) {
			from = jQuery(element);
		}
		from.effect('transfer', { to: jQuery('#navi-my-profile a.navi').eq(0), className: 'effects-transfer' }, 750);
		alert('This idea has been added to "My favorite ideas"!');

		// Enable this for a custom dialog message
		//centerElementVerticalViewportScroll('#favourite-saved');
		//showElement('favourite-saved');
	});
}

function ideaRemoveFromFavs(element, userid, ideaid, elementid) {
	var parameters = new Hash();
	parameters.set('userid', userid);
	parameters.set('ideaid', ideaid);

	ajaxFunction(BASEURL + 'actions/favouritesDel.php', parameters, null, function() {
		jQuery(elementid).hide('blind', function() {
			updateIdeaList(BASEURL + 'myIdeanetFavs.php', 'profile-reload-content-favourites');
		});
	});
}

function updateComments(ideaid) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	
	ajaxFunction(BASEURL + 'ideaDiscussion.php', parameters, 'idea-reload-content-comment');
}

function storeIdeaLang(ideaid, lang) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	parameters.set('lang', lang);

	ajaxFunction(BASEURL + 'actions/storeIdealang.php', parameters);
}

function submitExpertEval(cnt, dir, userid, ideaid) {
	var parameters = new Hash();
	parameters.set('cnt', cnt);
	parameters.set('userid', userid);
	parameters.set('ideaid', ideaid);

	for (var i=1; i<=cnt; i++) {
		var val = $("eval_val"+i).value;
		var key = $("eval_key"+i).value;

		parameters.set('val'+i, val);
		parameters.set('key'+i, key);
	}

	ajaxFunction(BASEURL + 'actions/storeExpertEval.php', parameters, null, 'complete_submitExpertEval');
}

function submitCommunityEval(ideaid, val, type) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	parameters.set('val', val);
	parameters.set('type', type);
	
	ajaxFunction(BASEURL + 'actions/storeCommunityEval.php', parameters);
}

function storeLinkIdea(destId,srcIds,callback_function) {
	var parameters = new Hash();
	parameters.set('srcids', srcIds);
	parameters.set('destid', destId);

	ajaxFunction(BASEURL + 'actions/linkIdeaStore.php', parameters, null, callback_function);
}

function delLinkIdea(destId,srcIds,callback_function) {
	var parameters = new Hash();
	parameters.set('srcids', srcIds);
	parameters.set('destid', destId);

	ajaxFunction(BASEURL + 'actions/linkIdeaDel.php', parameters, null, callback_function);
}

function storePresenter(ideaid, userid) {
	var parameters = new Hash();
	parameters.set('action', 'add');
	parameters.set('ideaid', ideaid);
	parameters.set('userid', userid);

	ajaxFunction(BASEURL + 'showPresenter.php', parameters, 'presenter-reload-content-0');
}

function delPresenter(ideaid, userid) {
	var parameters = new Hash();
	parameters.set('action', 'del');
	parameters.set('ideaid', ideaid);
	parameters.set('userid', userid);

	ajaxFunction(BASEURL + 'showPresenter.php', parameters, 'presenter-reload-content-0');
}

function storeManualPresenter(ideaid, username, email, phone, dep) {
	var parameters = new Hash();
	parameters.set('action', 'add');
	parameters.set('ideaid', ideaid);
	parameters.set('username', username);
	parameters.set('email', email);
	parameters.set('phone', phone);
	parameters.set('dep', dep);

	ajaxFunction(BASEURL + 'showPresenter.php', parameters, 'presenter-1');
}

function updateIdeaList(url, element_id, index, limit, order, order_dir, items_per_row, line_length, display_idea_include, filter, add_parameters) {
	var parameters = new Hash();

	if (add_parameters != null) {
		add_parameters = new Hash(add_parameters);
		add_parameters.each(function(pair) {
			parameters.set(pair.key, pair.value);
		});
	}

	parameters.set('index', index);
	parameters.set('limit', limit);
	parameters.set('order', order);
	parameters.set('order_dir', order_dir);
	parameters.set('items_per_row', items_per_row);
	parameters.set('line_length', line_length);
	parameters.set('display_idea_include', display_idea_include);
	parameters.set('filter', filter);

//	parameters.set('ajax_indicator_element', getParentTab(element_id));
//	parameters.set('morph_indicator_element', true);

	return ajaxFunction(url, parameters, element_id, null, null, null, true);
}

function updateUserImage() {
	ajaxFunction(BASEURL + 'myIdeanetShowUserImage.php', null, 'register-image');
}

function updateImageRegister() {
	ajaxFunction(BASEURL + 'register_image.php', null ,"register-image");
}

function updateMemberList(url, index, element_id, add_parameters) {
	var parameters = new Hash();

	if (add_parameters != null) {
		add_parameters = new Hash(add_parameters);
		add_parameters.each(function(pair) {
			parameters.set(pair.key, pair.value);
		});
	}


	parameters.set('index', index);

//	parameters.set('ajax_indicator_element', getParentTab(element_id));
//	parameters.set('morph_indicator_element', true);

	return ajaxFunction(url, parameters, element_id, null, null, null, true);
}

function updateIdeaListIdeaset(set_id,list_index) {
	var parameters = new Hash();
	parameters.set('setid', set_id);
	parameters.set('list_index', list_index);

	ajaxFunction(BASEURL + 'admin/reportingGeneratorIdeaSetValues.php', parameters, 'report-generation-ideaset');
}

function updateCfiList(listIndex,listCnt) {
	var parameters = new Hash();
	parameters.set('index', listIndex);
	parameters.set('listcnt', listCnt);

	ajaxFunction(BASEURL + 'callForIdeasListData.php', parameters, 'cfi_list');
}

function storeNotifications(user_id, comments, comment_childs, pinboard) {
	var parameters = new Hash();
	parameters.set('user_id', user_id);
	parameters.set('comments', comments);
	parameters.set('comment_childs', comment_childs);
	parameters.set('pinboard', pinboard);

	var element = jQuery('#store-notification-settings-result');
	
	var timeout = element.data('ajax-request-flash-timeout');
	if (timeout) {
		window.clearTimeout(timeout);
	}
	
	ajaxFunction(BASEURL + 'actions/storeNotifications.php', parameters, 'store-notification-settings-result', function() {
		element.show('blind', 750);

		var timeout = window.setTimeout(function() {
			element.hide('blind', null, 750, function() {
				element.empty();
			});

			element.removeData('ajax-request-flash-timeout');
		}, 2500);

		element.data('ajax-request-flash-timeout', timeout);
	});
}

function storeVisitor(target_id, viewer) {
	var parameters = new Hash();
	parameters.set('id', target_id);
	parameters.set('type', 'user');
	parameters.set('visitor', viewer);
	
	ajaxFunction(BASEURL + 'actions/storeVisitor.php', parameters);
}

function storeIdeaVisitor(target_id, viewer, callback) {
	var parameters = new Hash();
	parameters.set('id', target_id);
	parameters.set('type', 'idea');
	parameters.set('visitor', viewer);

	ajaxFunction(BASEURL + 'actions/storeVisitor.php', parameters, null, callback);
}

function storeProfileData(parameters) {
	ajaxFunction(BASEURL + 'myIdeanetShowProfile.php', parameters, "profile-reload-content-3", null, null, 'Changes saved.');
}

function delUserImage(userid) {
	var parameters = new Hash();
	parameters.set('userid', userid);
	parameters.set('delimage', 'true');

	ajaxFunction(BASEURL + 'myIdeanetShowUserImage.php', parameters, "user-image-container");
}

function delPickIdea(ideaid,userid) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	parameters.set('userid', userid);

	ajaxFunction(BASEURL + 'actions/delPickUser.php', parameters);
}

function updateFeaturedIdea(idea_id, action) {
	var parameters = new Hash();
	parameters.set('id', idea_id);
	parameters.set('action', action);

	ajaxFunction(BASEURL + 'actions/updateFeaturedIdea.php', parameters, null, null, null, 'Transaction successful!');
}

function setIdeaImage(folder, imagename) {
	var parameters = new Hash();
	parameters.set('folder', folder);
	parameters.set('filename', imagename);

	ajaxFunction(BASEURL + 'actions/imagePoolSetImage.php', parameters, null, 'complete_updateImagePool');
}

function archIdeaStore(ideaid) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);

	ajaxFunction(BASEURL + 'actions/ideaArch.php', parameters);
}

function ideaSetDiscussion(ideaid, val) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	parameters.set('val', val);

	ajaxFunction(BASEURL + 'actions/ideaSetDiscussion.php', parameters);
}

function ideaSetEvaluation(ideaid, val) {
	var parameters = new Hash();
	parameters.set('ideaid', ideaid);
	parameters.set('val', val);

	ajaxFunction(BASEURL + 'actions/ideaSetEvaluation.php', parameters);
}

function updateIdeaAuth(idea,index) {
	var parameters = new Hash();
	parameters.set('idea', idea);
	parameters.set('val', index+1);

	ajaxFunction(BASEURL + 'admin/updateIdeaAuth.php', parameters, null, null, null, "Rights changes saved!");
}


function makeIdeaOfMonth(id) {
	var parameters = new Hash();
	parameters.set('id', id);

	ajaxFunction(BASEURL + 'admin/updateIdeaOfMonth.php', parameters, 'complete_makeIdeaOfMonth');
}

function updatePortfolio(portfolio_name) {
	var element_id = portfolio_name + '-reload-content-portfolio';

	var parameters = new Hash();
//	parameters.set('ajax_indicator_element', getParentTab(element_id));
//	parameters.set('morph_indicator_element', true);

	parameters.set('portfolio_name', portfolio_name);
	parameters.set('xval', getFormSelectValue(portfolio_name + '-xaxis'));
	parameters.set('yval', getFormSelectValue(portfolio_name + '-yaxis'));

	ajaxFunction(BASEURL + 'poolPortfolio.php', parameters, element_id);
}

function updateFacebookUsername(username, prename, surname) {
	var parameters = new Hash();
	parameters.set('username', username);
	parameters.set('prename', prename);
	parameters.set('surname', surname);

	ajaxFunction(BASEURL + 'actions/updateFacebookUser.php', parameters);
}

function launchScheduler() {
	var parameters = new Hash();

	ajaxFunction(BASEURL + 'scheduler.php', parameters);
}
