(function($, window, undefined) {
	
	var me = {
		_create: function() {
			this.placeholder = this.element.attr('placeholder');
			this.activity = $('<img src="/NMGfiles/img/5.gif">').css('position', 'absolute').insertAfter(this.element).position({of: this.element, my:'left top', at:'right top', offset:"-14 3"}).hide();
			$.ui.autocomplete.prototype._create.apply(this, arguments);
			console.log(this.menu);
			this.element.bind('nmgsearchboxselect', $.proxy(this, '_suggestionSelect'));
			this.menu.element.addClass(this.options.cssClass);
			
			var self = this;
			this.element.val = function() {
				if (!arguments.length)
					return $.fn.val.apply(self.element, arguments);
				else
					return self.element;
			};
			
			if ($.browser.msie) {
				this.element.addClass('msie');
				self.showPlaceholder = true;
				self.element.attr('value', self.placeholder);
				this.element.bind('focus', function(){
					if (self.showPlaceholder)
						self.element.attr('value', '');
				});
				
				this.element.bind('blur', function(){
					if (self.element.attr('value') == '') {
						self.showPlaceholder = true;
						self.element.attr('value', self.placeholder);
					} else {
						slef.showPlaceholder = false;
					}
				});
			}
			
			this._renderMenu = this[this.options.menuRenderer];
			
			//this.element.autocomplete({
			//	minLength: 2,
			//	source:this._loadSuggestions
			//});
		},
		invalidateSuggestions: function() {
			this.suggestionData = null;
		},
		_loadSuggestions: function(request, response) {
			if (this.suggestionData) {
				response(this.suggestionData);
				return;
			}
			this.activity.show();
			var self = this;
			$.ajax({
				url: this.options.dataUrl,
				type: 'post',
				dataType: "json",
				data: $.extend({}, this.options.requestData, {
					search: request.term
				}),
				success: function( data ) {
					console.log('success', data);
					self.suggestionData = data;
					self.activity.hide();
					response(data);
				}
			});
		},
		_suggestionSelect: function(event, ui) {
			this.options.suggestionSelected.call(this, ui.item);
		},
		_resizeMenu: function() {
			var ul = this.menu.element;
			ul.outerWidth( Math.max(
				ul.width( "" ).outerWidth(),
				this.element.outerWidth()
			)+1);
		},
		_renderTagMenu: function(ul, items) {
			var matcher = new RegExp( '('+$.ui.autocomplete.escapeRegex(this.term)+')', "gi" );
			
			var tags = $.grep(items, function(v){
				matcher.lastIndex = 0;
				return matcher.test(v.tagName) || matcher.test(v.tagSlug);
			});
			if(tags.length) {
				noResults = false;
				$.each(tags, function(i,v){
					$( '<li class="nmg-searchbox-tag"></li>' )
					.data( "item.autocomplete", v )
					.append( '<a><span class="nmg-searchbox-tag-name">' + v.tagName.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + '</span>&nbsp;(<span class="nmg-searchbox-tag-slug">' + v.tagSlug.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + ')</div></a>' )
					.appendTo( ul );
				});
			}
			$( "<li class='nmg-searchbox-tag nmg-searchbox-tag-createnew'><a>Create new...</a></li>" ).data('item.autocomplete', {tagID:'new'}).appendTo(ul);
		},
		_renderSearchboxMenu: function( ul, items ) {
			var noResults = true;
			
			var strRegex = '('+$.ui.autocomplete.escapeRegex(this.term)+')';
			var matcher = new RegExp( strRegex, "gi" );
			
			if (items.names) {
				var fnames = $.grep(items.names, function(v){
					matcher.lastIndex = 0;
					return matcher.test(v.memName) || matcher.test(v.memBrief);
				});
				if(fnames.length) {
					noResults = false;
					ul.append( "<li class='ui-autocomplete-category nmg-searchbox-people-category'>People</li>" );
					$.each(fnames, function(i,v){
						$( '<li class="nmg-searchbox-people"></li>' )
						.data( "item.autocomplete", v )
						.append( '<a><div class="nmg-searchbox-profile-name">' + v.memName.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + '</div><div class="nmg-searchbox-profile-brief">' + v.memBrief.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + '</div></a>' )
						.appendTo( ul );
					});
				}
			}
			
			if (items.conditions) {
				var fconds = $.grep(items.conditions, function(v){
					matcher.lastIndex = 0;
					return matcher.test(v.conTitle);
				});
				if(fconds.length) {
					noResults = false;
					ul.append( "<li class='ui-autocomplete-category'>Conditions</li>" );
					$.each(fconds, function(i,v){
						$( '<li class="nmg-searchbox-conditions"></li>' )
						.data( "item.autocomplete", v )
						.append( '<a><span class="nmg-searchbox-condition-bullet"></span><span class="nmg-searchbox-condition-title">' + v.conTitle.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + '</span></a>' )
						.appendTo( ul );
					});
				}
			}
			
			if (items.treatments) {
				var ftreats = $.grep(items.treatments, function(v){
					matcher.lastIndex = 0;
					return matcher.test(v.treatTitle);
				});
				if(ftreats.length) {
					noResults = false;
					ul.append( "<li class='ui-autocomplete-category'>Treatments</li>" );
					$.each(ftreats, function(i,v){
						$( '<li class="nmg-searchbox-treatments"></li>' )
						.data( "item.autocomplete", v )
						.append( '<a><span class="nmg-searchbox-treatment-bullet"></span><span class="nmg-searchbox-treatment-title">' + v.treatTitle.replace(matcher, '<span class="nmg-searchbox-highlight">$1</span>') + '</span></a>' )
						.appendTo( ul );
					});
				}
			}
			
			if (noResults) {
				ul.append( "<li class='ui-autocomplete-category'>No Results</li>" );
			}
			
		},
		_response: function( content ) {
			if ( !this.options.disabled && content ) {
				this._suggest( content );
				this._trigger( "open" );
			} else {
				this.close();
			}
			this.pending--;
			if ( !this.pending ) {
				this.element.removeClass( "ui-autocomplete-loading" );
			}
		},
		
		_suggest: function( items ) {
			if (this.options.filterFunction) {
				items = this.options.filterFunction(items);
			}
			$.ui.autocomplete.prototype._suggest.call(this, items);
		},
		
		change: function( event ) {
			if ( this.previous !== this.element.val() ) {
				this._trigger( "change", event, { item: this.selectedItem } );
			}
		}
	};
	
	me.options = $.extend({}, $.ui.autocomplete.prototype.options, {
		delay: 400,
		source: me._loadSuggestions
	});
	
	$.widget('ui.nmgSearchbox', $.ui.autocomplete, me);
})(jQuery, window);
