var searchControlTimers = {};
var searchControlRequests = {};

function as_GetSearchControl(searchControlElement)
{
	return jQuery(searchControlElement.attr('SearchControl'));
}

function as_SaveSearchControlInfo(searchControl, info)
{
	searchControl.attr('SearchSettings', JSON.stringify(info));
}

function as_getSearchControlInfo(searchControl)
{
	return JSON.parse(searchControl.attr('SearchSettings'));
}

function as_SaveSearchControlRel(searchControlElement, searchControlSelector)
{
	searchControlElement.attr('SearchControl', searchControlSelector);
}

function as_ValidSearchFireUp(searchControl)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	var str = new String(jQuery(searchControlInfo.searchField).val());
	if(str.length >= searchControlInfo.searchFieldMinChars)
	{
		return true;
	}
	return false
}

function as_InitSearchFireUp(searchControl, instant)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	
	if(instant)
		as_SearchFireUp(searchControlInfo.searchControlsWrapper);
	else
		searchControlTimers[searchControlInfo.searchControlsWrapper] = setTimeout('as_SearchFireUp(' + '\'' + searchControlInfo.searchControlsWrapper + '\'' + ')', searchControlInfo.ajaxRequestFireUpDelay);
}

function as_SearchFireUp(searchControlWrapper)
{
	var searchControl = jQuery(searchControlWrapper);
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	var searchVal = jQuery(searchControlInfo.searchField).val();

	jQuery.ajax({
		    	type: searchControlInfo.RequestType,
			url: searchControlInfo.searchPage + '/' + searchVal + '.html',
			success: function(resp)
				{
					as_ProcessSearchResponse(searchControl, resp);
				},
			error: function()
				{
					//
				}
		})
}

function as_ProcessSearchResponse(searchControl, resp)
{
	var searchControl = searchControl;
	var searchHints = JSON.parse(resp);
	as_PopulateSearchResultsBox(searchControl, searchHints);
	
	if(searchHints.NrRecords > 0)
	{
		as_OpenSearchResultsBox(searchControl);
	}
	else{
		as_CloseSearchResultsBox(searchControl);
	}
}


function as_AbortSearchFireUp(searchControl)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	clearTimeout(searchControlTimers[searchControlInfo.searchControlsWrapper]);
	jQuery(searchControlInfo.searchResultsBox).css('visibility', 'hidden');
}

function as_OpenSearchResultsBox(searchControl)
{
	as_CloseSearchResultsBoxes(searchControl);
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	var searchResultsBox = jQuery('.' + searchControlInfo.searchResultsBoxCssClass + '[SearchControl=' +  searchControlInfo.searchControlsWrapper +']');
	searchResultsBox
		.css({
			top: searchControl.offset().top + searchControl.height() + 'px',
			left: searchControl.offset().left + 'px',
		     	visibility: 'visible'
			});
}

function as_CloseSearchResultsBox(searchControl)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	var searchResultsBox = jQuery('.' + searchControlInfo.searchResultsBoxCssClass + '[SearchControl=' +  searchControlInfo.searchControlsWrapper +']');
	searchResultsBox.css('visibility', 'hidden');
}

function as_PopulateSearchResultsBox(searchControl, data)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);	
	var searchResultsBox = jQuery('.' + searchControlInfo.searchResultsBoxCssClass + '[SearchControl=' +  searchControlInfo.searchControlsWrapper +']');
	
	searchResultsBox.find('.searchHeading, ul.searchResults').remove();
	//searchResultsBox.append('<div class="searchHeading">Existing: ' + data.NrRecords + '</div>');
	searchResultsBox.append('<div class="searchHeading">Existing:</div>');
	if(data.NrRecords > 0)
	{
		var optWrapper = jQuery('<ul class="searchResults"></ul>');
		optWrapper.appendTo(searchResultsBox);
			optWrapper
				.css({
					height: 'auto',
					overflow: ''
				 });
		if (data.NrRecords > 10)
			optWrapper
				.css({
					height: '100px',
					overflow: 'auto'
				 });
				
		for (var i=0; i<data.NrRecords; i++)
		{
			var sOpt = jQuery('<li></li>');
			var linkData = JSON.stringify(data['Records'][i]);
			
			if(searchControlInfo.fDisplaySearchResultItem != null)
				sOpt.html(eval(searchControlInfo.fDisplaySearchResultItem + '(' + linkData + ')'));
			else
				sOpt.html(linkData);
			sOpt.appendTo(optWrapper);
		}
	}
}

function as_CloseSearchResultsBoxes(searchControl)
{
	var searchControlInfo = as_getSearchControlInfo(searchControl);
	var searchResultsBoxes = jQuery('.' + searchControlInfo.searchResultsBoxCssClass);
	searchResultsBoxes.css('visibility', 'hidden');
}

ajaxSearch = function(settings)
			{
				this.settings = $.extend({
								searchControlsWrapper: '#SearchControl',
								searchField: 'input[name=StudentSearch]',								
								searchPage: 'ajax-search',
								searchPageParamName: null,
								RequestType: 'post',
								fDisplaySearchResultItem: null,
								fSelect: null,
								
								ajaxRequestFireUpDelay: 300,
								searchFieldMinChars: 1,
								
								searchResultsBoxCssClass: 'searchResultsBox',
								searchResultsBoxCloseBtnCssClass: 'searchResultsBoxCloseBtn'
							}, settings);
				
				this.init = function()
						{
							this.initSearchControls();
							this.buildSearchResultsBox();
							this.setSearchControlsEvents();
						}
	
				this.initSearchControls = function()
							{
								var s = this.settings;
								
								this.searchControl = jQuery(s.searchControlsWrapper);
								as_SaveSearchControlInfo(this.searchControl, s);
								
								this.searchField = this.searchControl.find(s.searchField);
								as_SaveSearchControlRel(this.searchField, s.searchControlsWrapper);
								
							}
																
				this.buildSearchResultsBox = function()
							{
								this.searchResultsBox = jQuery('<div></div>');
								as_SaveSearchControlRel(this.searchResultsBox, this.settings.searchControlsWrapper);
								
								this.searchResultsBox
									.addClass(this.settings.searchResultsBoxCssClass)
									.css({
										visibility: 'hidden',
										top: this.searchControl.offset().top + this.searchControl.height() + 'px',
										left: this.searchControl.offset().left + 'px',
										zIndex: 30000
									 })
									.appendTo('body');
												
								this.searchResultsBoxCloseButton = jQuery('<a href="#">[X]</a>');
								as_SaveSearchControlRel(this.searchResultsBoxCloseButton, this.settings.searchControlsWrapper)
								this.searchResultsBoxCloseButton
									.addClass(this.settings.searchResultsBoxCloseBtnCssClass)
									.attr({
										title: 'Close',
										rel: '.' + this.settings.searchResultsBoxCssClass
									      })
									.appendTo(this.searchResultsBox)
									.click(function()
										{
											var btn = jQuery(this);
											jQuery(btn.attr('rel') + "[SearchControl=" + btn.attr('SearchControl') + "]").css({visibility: 'hidden'})
											return false;
										})
							}
							
				this.setSearchControlsEvents = function()
								{
									this.searchField
										.keyup(function()
											{
												var sf = jQuery(this);
												var searchControl = as_GetSearchControl(sf);
												if(as_ValidSearchFireUp(searchControl))
												{
													as_AbortSearchFireUp(searchControl);
													as_InitSearchFireUp(searchControl);
												}
												else
												{
													as_AbortSearchFireUp(searchControl);
													as_CloseSearchResultsBox(searchControl);
												}
											})
										.blur(function()
											{
												var sf = jQuery(this);
												var searchControl = as_GetSearchControl(sf);
												as_CloseSearchResultsBox(searchControl);
											})
									this.searchField
										.mousedown(function()
												{
													var sf = jQuery(this);
													var searchControl = as_GetSearchControl(sf);
													if(as_ValidSearchFireUp(searchControl))
													{
														 as_AbortSearchFireUp(searchControl);
														 as_InitSearchFireUp(searchControl);
													}
													else
													{
														as_AbortSearchFireUp(searchControl);
														as_CloseSearchResultsBox(searchControl);
													}
												});
								}
				this.init();
			}