(function($)
{
	var success_functions = new Array();
	var retry_ajax_obj = new Object();

	$(document).ready(function()
	{
		$.ajaxSetup({
	        type: "POST",
	        timeout: 6000
	    });
	
		$('.retry_ajax_button').live('click', function()
		{
			var id = $(this).closest('.ajax_placeholder').attr('id');
			$.ajaxutils.retry_ajax(id);
			return false;
		});
	});

	jQuery.ajaxutils = {
	
		retry_ajax: function(id)
		{
			var retry_obj = retry_ajax_obj[id];
			if (retry_obj)
				$.ajaxutils.process_ajax(retry_obj);
		},
		
		add_success_func: function(func)
		{
			success_functions.push(func);
		},
		
		process_ajax: function(ajax_data, callback)
		{
			var place_holder = $('#'+ajax_data.id);
			if (ajax_data.url == "")
				ajax_data.url = document.location.href;
			
			$.ajax({
				url: ajax_data.url,
				data: ajax_data.data,
				beforeSend: function()
				{
					$(place_holder).children().css('visibility', 'hidden');
					$(place_holder).append('<div class="ajax_loading"><span>' +
						'<img src="/img/layout/loading.gif" alt="laden..."/>' +
						'</span></div>');
					
					if (ajax_data.beforeSend != undefined)
						ajax_data.beforeSend.apply(ajax_data);
				},
				error: function(XMLHttpRequest, textStatus, errorThrown)
				{
					retry_ajax_obj[ajax_data.id] = ajax_data;
					$('.ajax_loading', place_holder).html('<span>' +
						'<p>Er was een probleem tijdens het ophalen van de data.<br />' +
						'Klik <a href="#" class="retry_ajax_button">hier</a> om het nogmaals te proberen.</p>' +
						'</span>');
					
					if (ajax_data.error != undefined)
						ajax_data.error.apply(ajax_data);
				},
				success: function(ajaxData, textStatus)
				{
					delete retry_ajax_obj[ajax_data.id];
					
					if (ajaxData.search('<div id="ajax_result">') == -1)
					{
						$(place_holder).html('<p>Error ('+ajax_data.url+'):<br /><br />'+ajaxData+'</p>');
					}
					else
					{
						$(ajaxData).each(function() {
							if ($(this).hasClass('alert'))
							{
								if ($.dialogutils) {
									$.dialogutils.message_dialog(
										$('.title', this).html(), $('.message', this).html());
								}
								else {
									alert($('.message', this).html());
								}
							}
						});
						if ($.fn.destroy) {
							place_holder.destroy();
						}
						$(place_holder).html($('#ajax_html', ajaxData).html());
						if ($.fn.initialize) {
							place_holder.initialize();
						}
						document.title = $('#ajax_title', ajaxData).text();
						
						if (ajax_data.success != undefined) {
							ajax_data.success.apply(ajax_data);
						}
						
						for (var i in success_functions) {
		    				success_functions[i](ajaxData);
		    			}
		    			
		    			if (callback) {
		    				callback.apply(this);
		    			}
					}
				}
			});
			return false;
		},
		
		ajax_link_click: function(data)
		{
			var default_data = {
				id: $(this).closest('.ajax_placeholder').attr('id'),
				url: $(this).attr('href')+'/ajax'
			};
			var final_data = $.extend(default_data, data);
			$.ajaxutils.process_ajax(final_data);
			return false;
		},
		
		ajax_form_submit: function(data)
		{
			var form = $(this).closest('form');
			
			$('.input_textarea', form).each(function() {
				var name = $(this).attr('name');
				var html = 'false';
				
				if ($.fn.ckeditor && $(this).ckeditorGet()) {
					html = 'true';
				}
				
				$(this).after('<input type="hidden" name="'+name+'_html" value="'+html+'"/>');
			});
			
			var url = $(form).attr('action');
			if (url == "")
				url = document.location.href;
			var default_data = {
				id: $(this).closest('.ajax_placeholder').attr('id'),
				url: url+'/ajax',
				data: $(form).serialize()
			};
			var final_data = $.extend(default_data, data);
		
			$.ajaxutils.process_ajax(final_data);
			return false;
		}
	};
	
	$.fn.ajax_link_click = function(data)
	{
		return this.each(function() {
			$.ajaxutils.ajax_link_click.apply(this, new Array(data));
		});
	};
	
	$.fn.ajax_form_submit = function(data)
	{
		return this.each(function() {
			$.ajaxutils.ajax_form_submit.apply(this, new Array(data));
		});
	};
	
})(jQuery);
