( function( $ ) {

	var methods = {
		init 	: function( options ) {
			var options 					= $.extend({},  $.fn.ajaxHandler.settings, options);
			var searchObjects			= $.find(options.searchSelector);
			var ajaxHandlerCalls	= { calls : [] };

			// door pagina loopen en alle
			// benodige ajax calls ophalen
			$.each(searchObjects, function(keyObjects, searchObject) {
				var ajaxHandlerCallObjects 				= $(searchObject).find('input[name*="'+options.functionName+'"]');
				var ajaxHandlerResultElement			= $(searchObject).attr('id');
				var ajaxHandlerExtendDataObjects	= $(searchObject).find(options.extendDataSelector);
				var ajaxHandlerExtendData					= {};

				// extend data ophalen en verwerken
				// (denk aan ids die nodig zijn etc)
				$.each(ajaxHandlerExtendDataObjects, function(key, ajaxHandlerExtendDataObject) {
					ajaxHandlerExtendData[$(ajaxHandlerExtendDataObject).attr('name')] = $(ajaxHandlerExtendDataObject).val();
				});

				$.each(ajaxHandlerCallObjects, function(key, ajaxHandlerCallInput) {
					var ajaxHandlerCall = {
						name					: $(ajaxHandlerCallInput).val(),
						resultelement	: ajaxHandlerResultElement,
						extenddata		: ajaxHandlerExtendData
					}
					ajaxHandlerCalls['calls'].push(ajaxHandlerCall);
					delete ajaxHandlerCall;
				});

				delete ajaxHandlerCallObjects;
				delete ajaxHandlerResultElement;
				delete ajaxHandlerExtendDataObjects;
				delete ajaxHandlerExtendData;

			});


			// door collectie loopen
			// en calls uitvoeren
			$.each(ajaxHandlerCalls['calls'], function(key, ajaxHandlerCall){
				methods.doCall({
					ajaxHandlerCall 					: ajaxHandlerCall.name,
					ajaxHandlerResultElement 	: ajaxHandlerCall.resultelement,
					ajaxHandlerExtendData 		: ajaxHandlerCall.extenddata
				})
			});
		},

		doCall	: function ( options ) {
			var options 									= $.extend({},  $.fn.ajaxHandler.settings, options);
			var ajaxHandlerCall						= options.ajaxHandlerCall;
			var ajaxHandlerResultElement	= options.ajaxHandlerResultElement;
			var ajaxHandlerExtendData			= options.ajaxHandlerExtendData;

			var data = {
				ajaxHandlerCall						: ajaxHandlerCall,
				ajaxHandlerResultElement	: ajaxHandlerResultElement,
				ajaxHandlerExtendData			: ajaxHandlerExtendData
			};

			$.ajax({
				type				: options.ajaxType,
				url					: options.ajaxUrl,
				dataType		: options.ajaxDataType,
				data 				:	{ data : data },

				success: function(data) {
					$('#'+ajaxHandlerResultElement).find('.ajaxRemove').each(function(){
						$(this).remove();
					});
					$('#'+ajaxHandlerResultElement).append(data);
				}
			});
		}
	};

	// namespace & method handling
	$.fn.ajaxHandler = function ( method ) {

		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			return methods.init.apply( this, arguments );
		} else {
			$.error( 'Method ' +  method + ' does not exist on jQuery.ajaxHandler' );
		}
	};

	// default settings
	$.fn.ajaxHandler.settings = {
		ajaxType						: 'GET',
		ajaxUrl							: '/interactive/files/ajax/ajax.basic.php',
		ajaxDataType				: 'html',
		searchSelector			: '.ajaxHandler',
		extendDataSelector	: '.ajaxHandlerCallData',
		functionName				: 'ajaxHandlerCall'
	};

})( jQuery );
