/***************************************************/
/* Default Searchbar autocomplete functions  */
/***************************************************/
/*
 * Add options referenced by the autocompleter plugin to the defaults
 * in order that we can set them dynamically in the array of options
 * used to initialize the autocompleter on page load.
 * 
*/
$.Autocompleter.defaults.parse = false;
$.Autocompleter.defaults.dataType = null;

/* The searchbar caches 10 results by default. This is too many;
 * if the searchbar daemon returns 9 results, then there could 
 * be more matching that were omitted, and therefore a search for a 
 * longer searchterm should not be limited to the initially returned
 * subset. However, if the daemon returns 8 results, 
 * there are in theory no more matching results, so if the substring 
 * is lengthened, in theory the set of possible results is still 
 * maximally that 8.
 */
var cache_length = 8; 

var wrap_json_response_for_autocompleter = function(data, additional_value_f) {
	/*
	 * The jQuery Autocompleter expects each row to have .data and .value.
	 * Here, we wrap whatever the json returned row is appropriately,
	 * with all data in 'data', and the value matching the searched term in 'value'.
	 *
	*/
	$(data).each( function(i, row) {
		// Allow a hook for additional value
		var additional_value = '';
		if (additional_value_f) { additional_value =  additional_value_f(row); }
		
		if (!row.data) { row.data = row; }
		// Add first column as value for subset matching
		if (!row.value) { row.value = row.data.display_values[0] + additional_value; }
		if (!row.result){ row.result = row.data.display_values[0] + additional_value; }
	});
	return data;
};

var format_search_data = function( row, position, max, value, extra_class, onclick ){
	/*
	 * Row is a json dict:
	 * A list of .display_values to display (company name, symbol, rated?),
	 * And .extra data in a dictionary (company_id, company_slug, plan_id, plan_slug)
	 *
	 * Returned is the string to be contained in the <li> displayed below the searchbox.
	 * 
	 */
	
	// Set up onclick string
	if (typeof onclick == 'function') {
		onclick = onclick(row);
	}
	var row_html = '<div class="searchbar-row ' + extra_class + 
		'" onclick="' + onclick + '">';
	if (!row.display_values || !row.extra) {
		return row_html; // Something has gone wrong.
	}
	// Add each column to the <li>
	$(row.display_values).each( function(i, val) {
		if (!val) { val = '&nbsp;'; }
		row_html += '<div class="searchbar-column searchbar-column-' + i.toString() + '">' +
			 val + '</div>';
	});
	row_html += '</div>';
	return row_html;
};

var bind_autocomplete_keypress = function() {
	// Trigger select action on tab or enter for all autocompleters
	$('input.autocompleting:not(input.keypress-bound)').each( function(i, input) {
		$(input).addClass('keypress-bound');
		$(input).bind(($.browser.opera ? "keypress" : "keydown"), function(event) {
			if (event.keyCode == 9 || event.keyCode == 13) {
				event.preventDefault();
				$($('.ac_over .searchbar-row')[0]).click();
			}
		});
	});
};

var submit_search = function(clicked) {
	// Submit form containing clicked button.
	$(clicked).parents().filter('form').submit();
};

var open_autocomplete = function(input) {
	// Open list corresponding to passed identifier
	var event = jQuery.Event({type:($.browser.opera ? "keypress" : "keydown")});
	event.keyCode = 40;
	input.focus();
	input.trigger(event);
};

/***************************************************/
/* Company/Plan Searchbar autocomplete functions  */
/***************************************************/
var wrap_json_response_for_plan_autocompleter = function(data, hide_extra_row) {
	data = wrap_json_response_for_autocompleter(data);
	// Append extra 'Search for all plans with' row
	if (!hide_extra_row && data.length > 9) {
		var q = data[0].data.extra.q.toLowerCase();
		var extra_row = {
			data: {
				display_values: ['<span class="link-div">Show all results for "' + q + '"</span>','',''],
				extra: { onclick: "document.location='/search-results/?q=" + escape(q) + "';" }
			},
			value: '',
			result: ''
		};
		data.push(extra_row);
	}
	return data;
};

var format_plan_search_data = function( row, position, max, value ){
	/* Special case: coloring changes based on rated or not-rated */
	var rating_class = row.display_values[2].replace(' ','-');
	
	/* Clicking on the row should take the user to the plan page by default. */
	var onclick = '';
	if (!row.extra.onclick) {
		onclick = "redirect_to_plan('" + row.extra.company_id + "','" + row.extra.company_slug + 
			"','" + row.extra.plan_id + "','" + row.extra.plan_slug + "');";
	} else {
		onclick = row.extra.onclick; 
	}

	return format_search_data(row, position, max, value, 'plan-searchbar ' + rating_class, onclick);
};

var redirect_to_plan = function(company_id, company_slug, plan_id, plan_slug) {
	var url = '/401k-rating/' + company_id.toString() + '/' + company_slug + '/';
	if (plan_id && plan_slug) {
		url += plan_id.toString() + '/' + plan_slug + '/';
	}
	document.location = url;
};

var initialize_plan_searchbars = function(passed_options) {
	var options = {	formatItem: format_plan_search_data,
			extraParams: {},
			dataType: 'json', 
			//delay:150,
			parse: wrap_json_response_for_plan_autocompleter,
			width: '600px',
			scrollHeight: 'none',
			max: 100,
			cacheLength: cache_length };
	if (passed_options) {
		options = $.extend(options,passed_options);
	}
	
	var extra_selector = (passed_options && passed_options.extra_selector) || '';
	bind_autocomplete_keypress();
	$(extra_selector + '.plan-searchbar-input').autocomplete(
		'/do-autocomplete-search/',
		options
	);
};

var set_company_id = function(row) {
	// Set the company id if that field exists. If not, this will not result in any change
	return "$('#id_company_id').val('" + row.extra.company_id + "');"
};
var wrap_json_response_for_plan_autocompleter_companies_only = function(data) {
	return wrap_json_response_for_plan_autocompleter(data, true);
};

var only_company_names = function(row, position, max, value) {
	// Special case to only show and select company names, for 'Invite friends', for example
	return format_search_data(row, position, max, value, 'plan-searchbar', set_company_id);
};

var initialize_company_only_searchbars = function(passed_options) {
	// Uninitialize any already initialized plan searchbars
	$('.company-only-searchbar-input.plan-searchbar-input').removeClass(
			'keypress-bound').unautocomplete();
	
	// Hide ticker and rating, and don't redirect on click.
	var options = {
		extra_selector: '.company-only-searchbar-input',
		width: '400px',
		resultsClass:'ac_results company-only-searchbar',
		formatItem: only_company_names,
		parse: wrap_json_response_for_plan_autocompleter_companies_only
	};
	
	if (passed_options) { $.extend(options, passed_options); }
	initialize_plan_searchbars(options);
};

var initialize_rated_company_only_searchbars = function(passed_options) {
	var options = {
		extraParams: {'rated': 1}
	};
	
	if (passed_options) { $.extend(options, passed_options); }
	initialize_company_only_searchbars(options);
};
 

/***************************************************/
/* NAICS code autocomplete functions  */
/***************************************************/
var wrap_json_response_for_naics_autocompleter = function(data) {
	// Append industry description to code
	var additional_value_f = function(row) { 
		if (row.display_values && row.display_values.length > 1 && row.display_values[1]) {
			return ' ' + row.display_values[1];
		} else { return ''; }
	};
	return wrap_json_response_for_autocompleter(data, additional_value_f);
};

var format_naics_search_data = function( row, position, max, value ){
	/* Clicking on the row call a application-specific respond_to_naics_select_value method */
	var onclick = '';
	if (!row.extra.onclick) {
		onclick = "respond_to_naics_select_value('" + row.display_values[0] + "');";
	} else {
		onclick = row.extra.onclick; 
	}
	
	return format_search_data(row, position, max, value, 'naics-searchbar', onclick);
};

var respond_to_naics_select_value = function(code) {
	$('#id_business_code').val(code);
}

var initialize_naics_searchbars = function(passed_options) {
	var options = {	formatItem: format_naics_search_data,
			extraParams: {},
			dataType: 'json',
			//delay:150,
			parse: wrap_json_response_for_naics_autocompleter,
			width: '400px',
			scrollHeight: 'none',
			max: 100,
			cacheLength: cache_length };
	if (passed_options) {
		options = $.extend(options,passed_options);
	}
	
	bind_autocomplete_keypress();
	$('.naics-searchbar-input').autocomplete(
			'/financial/get-naics-options-autocomplete/',
			options
	);
};

/***************************************************/
/* Investment/Fund autocomplete functions  */
/***************************************************/
var wrap_json_response_for_investment_autocompleter = function(data) {
	// Append additional investment details to name
	var additional_value_f = function(row) { 
		if (row.display_values && row.display_values.length > 1 && row.display_values[1]) {
			return ' (' + row.display_values[1] + ')';
		} else { return ''; }
	};
	return wrap_json_response_for_autocompleter(data, additional_value_f);
};
var format_investment_search_data = function( row, position, max, value ){
	/* Clicking on the row call a application-specific respond_to_investment_select_value method */
	var onclick = '';
	if (!row.extra.onclick) {
		onclick = "respond_to_investment_select_value(" + row.extra.instrument_id + 
		",'" + row.display_values[0] + "','" + row.display_values[1] + "');";
	} else {
		onclick = row.extra.onclick; 
	}

	return format_search_data(row, position, max, value, 'investment-searchbar', onclick);
};

var initialize_investment_searchbars = function(passed_options) {
	var options = {	formatItem: format_investment_search_data,
			extraParams: {},
			dataType: 'json',
			//delay:150,
			parse: wrap_json_response_for_investment_autocompleter,
			width: '400px',
			scrollHeight: 'none',
			max: 100,
			cacheLength: cache_length };
	if (passed_options) {
		options = $.extend(options,passed_options);
	}
	
	bind_autocomplete_keypress();
	$('.investment-searchbar-input').autocomplete(
		'/financial/get-instrument-options-autocomplete/',
		options
	);
};
