function LiveSearch(parameters) {

	// Setting default values, when needed
	parameters.moreActivityLinkSelector = parameters.moreActivityLinkSelector || 'more_activity_link';
	parameters.activityContainerSelector = parameters.activityContainerSelector || 'activity_container';
	parameters.activityMoreLinkSelector = parameters.activityMoreLinkSelector || 'activityMoreLink';
	parameters.activityMoreIndicatorSelector = parameters.activityMoreIndicatorSelector || 'activityMoreIndicator';
	parameters.liveSearchResultsCountSelector = parameters.liveSearchResultsCountSelector || 'live_search_results_count';
	parameters.boldBorderSelector = parameters.boldBorderSelector || 'div.boldborder';
	parameters.nothingSelector = parameters.nothingSelector || '#activity_container div.nothing';
	parameters.activityLoadingIndicatorSelector = parameters.activityLoadingIndicatorSelector || 'activity_loading_indicator';
	parameters.liveSearchResultsSelector = parameters.liveSearchResultsSelector || 'live_search_results';

	// Getters / Setters
	this.setParameter = function(parameter, value) {
		this._parameters[parameter] = value;
	}

	this.setParameters = function(parameters) {
		this._parameters = parameters;
	}

	this.getParameters = function() {
		return this._parameters;
	}

	this.setSearchParams = function(params) {
		this._search_params = params;
	}

	this.getSearchParams = function() {
		return this._search_params;
	}

	this.setCheckUrl = function(url) {
		this._check_url = url;
	}

	this.getCheckUrl = function() {
		return this._check_url;
	}

	this.setResultUrl = function(url) {
		this._result_url = url;
	}

	this.getResultUrl = function() {
		return this._result_url;
	}

	this.exclude = function(id) {
		this._exclude_activities['exclude_activities[' + id + ']'] = id;
	}

	this.freeze = function() {
		this._freeze = true;
	}

	this.unfreeze = function() {
		this._freeze = false;
	}

	// Callbacks
	this.moreActivitiesOnComplete = function(xhr, json, obj) {
		$(obj.getParameters().moreActivityLinkSelector).remove();
		$(obj.getParameters().activityContainerSelector).innerHTML = $(obj.getParameters().activityContainerSelector).innerHTML + xhr.responseText;
	}

	this.changePageOnComplete = function(xhr, json, obj) {
		$(obj.getParameters().activityContainerSelector).update(xhr.responseText);
	}

	this.loadNewResultsOnComplete = function(xhr, json, obj) {
		if ($(obj.getParameters().liveSearchResultsCountSelector)) {
			$(obj.getParameters().liveSearchResultsCountSelector).innerHTML = 0;
		}

		$$(obj.getParameters().boldBorderSelector).each(function(el) {
			el.removeClassName('boldborder');
		});

		var params = obj.getSearchParams();

		if (params['live_search'] && !$$(params.nothingSelector).length) {
			$(obj.getParameters().activityContainerSelector).innerHTML = xhr.responseText + $(obj.getParameters().activityContainerSelector).innerHTML;
		} else {
			$(obj.getParameters().activityContainerSelector).innerHTML = xhr.responseText;
		}

		xhr.responseText.evalScripts();

		if ($(obj.getParameters().activityLoadingIndicatorSelector)) {
			$(obj.getParameters().activityLoadingIndicatorSelector).hide();
		}

		$(obj.getParameters().activityContainerSelector).fire('activity:containerUpdated');

		// Custom callback 
		var customCallback = obj.getParameters().loadNewResultsOnComplete;

		if (typeof customCallback === 'function') {
			customCallback(xhr, json, obj);
		}
	}

	this.checkNewResultsCountOnComplete = function(xhr, json, obj) {
		var count = parseInt(xhr.responseText);

		if (count > 0) {
			if (count > 10) {
				count = '10+';
			}

			$(obj.getParameters().liveSearchResultsCountSelector).innerHTML = count;

			if ($(obj.getParameters().liveSearchResultsSelector).offsetHeight == 0) {
				new Effect.BlindDown($(obj.getParameters().liveSearchResultsSelector));
			}
		} else {
			$(obj.getParameters().liveSearchResultsSelector).hide();
		}
	}

	// Common Methods
	this.moreActivities = function(last_activity_time) {
		var url = this.getResultUrl();
		var params = this.getSearchParams();
		var obj = this;
		
		params['lastActivityTime'] = last_activity_time;

		$(this.getParameters().activityMoreLinkSelector).hide();
		$(this.getParameters().activityMoreIndicatorSelector).show();

		var request = new Ajax.Request(url, {
			parameters: params,
			onComplete: function(xhr, json) {
				obj.moreActivitiesOnComplete(xhr, json, obj);
			}
		});
	}

	this.changePage = function(page) {
		var url = this.getResultUrl();
		var params = this.getSearchParams();
		var obj = this;
		
		params['page'] = page;

		var request = new Ajax.Request(url, {
			parameters: params,
			onComplete: function(xhr, json) {
				obj.changePageOnComplete(xhr, json, obj)
			}
		});
	}

	this.loadNewResults = function() {
		if (this._freeze) {
			return;
		}

		var url = this.getResultUrl();
		var params = this.getSearchParams();
		var obj = this;

		if ($(this.getParameters().liveSearchResultsCountSelector) && parseInt($(this.getParameters().liveSearchResultsCountSelector).innerHTML) > 20) {
			params['live_search'] = undefined;
		} else {
			params['live_search'] = 1;
		}

		if (params['lastActivityTime']) {
			params['lastActivityTime'] = undefined;
		}
		
		this.setSearchParams(params);

		if ($(this.getParameters().liveSearchResultsSelector)) {
			new Effect.BlindUp(this.getParameters().liveSearchResultsSelector, {'duration': 0.6});
		}

		for (i in this._exclude_activities) {
			params[i] = this._exclude_activities[i]
		}

		var request = new Ajax.Request(url, {
			parameters: params,
			onComplete: function(xhr, json) {
				obj.loadNewResultsOnComplete(xhr, json, obj);
			}
		});
	}

	this.checkNewResultsCount = function(params) {
		if (this._freeze) {
			return;
		}
		
		if ($(this.getParameters().liveSearchResultsCountSelector).innerHTML != '10+') {
			var params = this.getSearchParams();
			var url = this.getCheckUrl();
			var obj = this;

			for (i in this._exclude_activities) {
				params[i] = this._exclude_activities[i]
			}

			var request = new Ajax.Request(url, {
				parameters: params,
				onComplete: function(xhr, json) {
					obj.checkNewResultsCountOnComplete(xhr, json, obj);
				}
			});
		}
	}

	// Constructor
	var search_params = parameters['search_params'] || {};
	this.setSearchParams(search_params);

	var check_url = parameters['check_url'] || '/';
	this.setCheckUrl(check_url);

	var result_url = parameters['result_url'] || '/';
	this.setResultUrl(result_url);

	this.setParameters(parameters);

	this._exclude_activities = {};
}
